根据另一个控件的值,只显示许多控件中的一个

时间:2012-04-03 12:59:31

标签: wpf

我有一个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的新手,我正在努力坚持最佳设计实践。

谢谢!

2 个答案:

答案 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]";