我有一个属性是数据库数据类型( char
、 DateTime
、 int
、 float
等...),我想更改用于输入所选类型值的控件。所以对于文本值,我想要一个 TextBox
对于日期值,我想要 DatePicker
.
我想到的一种方法是在我的表单上设置每个控件并设置它们的Visibility
使用适当的 IValueConverter
执行。我知道这会起作用,但它会创建很多代码并且感觉不是很好。
我认为的另一种方法是使用 ContentPresenter
并将其内容设置为 Style
和 DataTriggers
但我无法让它工作。
<Style x:Key="TypedValueHelper" TargetType="{x:Type ContentPresenter}">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=DataType}" Value="Char">
<Setter Property="Content" Value="???"/>
</DataTrigger>
<DataTrigger Binding="{Binding Path=DataType}" Value="Date">
<Setter Property="Content" Value="???"/>
</DataTrigger>
<DataTrigger Binding="{Binding Path=DataType}" Value="Integer">
<Setter Property="Content" Value="???"/>
</DataTrigger>
</Style.Triggers>
</Style>
如果有人可以填写我的 “???” 或提供更好的解决方案请做。
最佳答案
您可以将样式与 setter 和 DataTemplates 结合使用。你的代码中基本上有它的开始,虽然我不认为 ContentPresenter
是正确的样式控件,因为它没有模板。
创建这样的样式:
<Style x:Key="TypedValueHelper" TargetType="{x:Type ContentControl}">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=DataType}" Value="Char">
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<TextBox Text="{Binding Path=.}" />
</DataTemplate>
</Setter.Value>
</Setter>
</DataTrigger>
<DataTrigger Binding="{Binding Path=DataType}" Value="Integer">
<Setter Property="ContentTemplate">
<Setter.Value>
<DataTemplate>
<Slider Maximum="100" Minimum="0" Value="{Binding Path=.}"
Orientation="Horizontal" />
</DataTemplate>
</Setter.Value>
</Setter>
</DataTrigger>
</Style.Triggers>
</Style>
然后使用
ContentControl
中的样式:<ContentControl Content="{Binding MyValue}"
Style="{StaticResource TypedValueHelper}">
关于.net - 使用 WPF 根据绑定(bind)属性动态显示控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2911626/