2012-04-03 32 views
1

我将一个ComboBox绑定到定义为此的对象集合。根据另一个控件的值仅允许许多控件中的一个显示

public class TierOption 
{ 
    public string Option { get; set; } 
    public Type DataType { get; set; } 
} 
public class TierOptions : ObservableCollection<Tier1Option> 
{ 

} 

我有3个与此相关的组合框其他控件,这是一个文本框,组合框,或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寻找令人费解的混乱不无论工作。作为wpf的新手,我非常努力地坚持最好的设计实践。

谢谢!

回答

4

你可以用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 ...}"/> 

上面的代码只是想法,你可以有做adjustements。例如,您将无法修改字符串项目本身(您可能需要封装列表中的每个项目)

如果您的列表包含所有相同类型的项目,则可以在contentControl上使用ContentTemplateSelector。

ContentControl Content="{Binding SelectedItem, ElementName=YourCombBox}" ContentTemplateSelector="{StaticResource YourTemplateSelector}" 

MSDN DOC about ContentControl.ContentTemplateSelector Property

+0

+1我觉得这个想法比我最初使用触发器的想法要好。如果您的控件数量增加,触发器会使其更加困难。拥有不同的数据模式是迈向未来的方式,因为如果需要,以后可以轻松添加更多控件。 – dowhilefor 2012-04-03 13:54:27

+0

这看起来像我会喜欢它会工作,如果第一个组合框中的每个对象都是特定的类型,但每个对象都具有相同的类型(TierOption),它具有定义DataType的属性。我误解了什么吗? – elo 2012-04-03 15:20:15

+0

@elo对不起,您对了!我读得太快了,所以你必须为列表中的每种类型的选项创建一个类(继承自TierOption)。 – Jonas 2012-04-03 15:39:25

0

绑定到细节可见性的ElementName =组合框路径= SelectedItem.DataType。你将需要使用一个返回可见性的转换器。您将需要两个转换器返回相反的答案。如果你有两个以上的组合,那么更多的是乔纳斯。

我认为类型是一个系统类,它似乎是一个自定义类。扩展该类以具有其他属性。即使Type是一个系统类型,你也可以创建一个实现它并扩展它的类。

public Visibility TextBoxVisibility { get; } 
    public Visibility ComboBoxVisibility { get; } 
    ... 

    Then on TextBox bind the visibility 

    Visisbility="{binding ElementName=Combobox Path=SelectedItem.DataType.TextBoxVisibility]"; 
相关问题