我有一个ComboBox绑定到一个定义为此对象的对象集合。
public class TierOption
{
public string Option { get; set; }
public Type DataType { get; set; }
}
public class TierOptions : ObservableCollection<Tier1Option>
{
}
我有3个与此ComboBox相关的其他控件,它们是TextBox,ComboBox或WPFToolKit:DatePicker。
我只需要显示与第一个ComboBox中选择的对象的数据类型(Type)相对应的相关控件,而不显示其他控件。
伪代码示例: (可能太接近于屠杀C#,但希望它传达了这个想法)
switch (ComboBox.SelectedItem.DataType)
{
case String:
TextBox.Visibility = Visibility.Visible;
ComboBox.Visibility = Visibility.Hidden;
DatePicker.Visibility = Visibility. Hidden;
break;
case DateTime:
TextBox.Visibility = Visibility.Hidden;
ComboBox.Visibility = Visibility.Hidden;
DatePicker.Visibility = Visibility. Visible;
break;
<...so forth and so on...>
}
我的尝试导致了非常不同寻常的错综复杂的混乱,无论如何都行不通。作为wpf的新手,我正在努力坚持最佳设计实践。
谢谢!
答案 0 :(得分:4)
您可以使用DataType属性
来使用DataTemplate<...Resources>
<DataTemplate DataType="{x:Type sys:String}">
<TextBox Text="{Binding}"/>
</DataTemplate>
<DataTemplate DataType="{x:Type DateTime}">
<DatePicker .../>
</DataTemplate>
...
</...Resources>
<ContentControl Content="{Binding SelectedItem, ElementName=myComboBox}"/>
<ComboBox ItemsSource="{Binding ...}"/>
上面的代码就是这个想法,你可能需要做出调整。例如,您将无法修改字符串项本身(您可能必须封装列表中的每个项目)
如果您的列表包含相同类型的所有项目,则可以在contentControl上使用ContentTemplateSelector。
ContentControl Content="{Binding SelectedItem, ElementName=YourCombBox}" ContentTemplateSelector="{StaticResource YourTemplateSelector}"
MSDN DOC about ContentControl.ContentTemplateSelector Property
答案 1 :(得分:0)
绑定到ElementName = ComboBox Path = SelectedItem.DataType的详细可见性。您将需要使用返回可见性的转换器。您将需要两个转换器返回相反的答案。如果你有两个以上的组合,那么更多的是乔纳斯。
我假设Type是一个系统类,它似乎是一个自定义类。扩展该类以具有其他属性。即使Type是系统类型,您也可以创建一个实现它并扩展它的类。
public Visibility TextBoxVisibility { get; }
public Visibility ComboBoxVisibility { get; }
...
然后在TextBox
绑定可见性
Visisbility="{binding ElementName=Combobox Path=SelectedItem.DataType.TextBoxVisibility]";