Wpf 基于另一个控件的值,仅使多个控件中的一个可见

Wpf 基于另一个控件的值,仅使多个控件中的一个可见,wpf,Wpf,我有一个组合框绑定到一个定义为这样的对象集合 public class TierOption { public string Option { get; set; } public Type DataType { get; set; } } public class TierOptions : ObservableCollection<Tier1Option> { } 公共类分层 { 公共字符串选项{get;set;} 公共类型数据类型{get;set;} } 公

我有一个组合框绑定到一个定义为这样的对象集合

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

}
公共类分层
{
公共字符串选项{get;set;}
公共类型数据类型{get;set;}
}
公共类分层:ObservableCollection
{
}
我还有3个与这个组合框相关的控件,它们是文本框、组合框或WPFToolKit:DatePicker

我只需要显示与第一个组合框中所选对象的数据类型(Type)相对应的相关控件,而不显示其他控件

伪代码示例: (可能与《屠夫C#》太接近了,但希望它能传达这个想法)

开关(ComboBox.SelectedItem.DataType)
{
大小写字符串:
TextBox.Visibility=可见性.Visibility;
ComboBox.Visibility=Visibility.Hidden;
DatePicker.Visibility=Visibility.Hidden;
打破
案例日期时间:
TextBox.Visibility=Visibility.Hidden;
ComboBox.Visibility=Visibility.Hidden;
DatePicker.Visibility=可见性.Visibility;
打破
}
我的尝试已经导致了非常非wpf外观错综复杂的混乱,无论如何都无法工作。作为wpf的新手,我正努力保持最佳设计实践的真实性


谢谢大家!

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

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

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

我假设类型是一个系统类,它看起来是一个自定义类。扩展该类以具有其他属性。即使类型是系统类型,您也可以创建一个实现它的类并对其进行扩展

   public Visibility TextBoxVisibility { get; }
   public Visibility ComboBoxVisibility { get; }
   ...
然后在
TextBox
上绑定可见性

   Visisbility="{binding ElementName=Combobox Path=SelectedItem.DataType.TextBoxVisibility]";

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

我假设类型是一个系统类,它看起来是一个自定义类。扩展该类以具有其他属性。即使类型是系统类型,您也可以创建一个实现它的类并对其进行扩展

   public Visibility TextBoxVisibility { get; }
   public Visibility ComboBoxVisibility { get; }
   ...
然后在
TextBox
上绑定可见性

   Visisbility="{binding ElementName=Combobox Path=SelectedItem.DataType.TextBoxVisibility]";

+我认为这个想法比我最初使用触发器的想法要好。如果控件数量增加,触发器将使其更加困难。拥有不同的datatemplates是一种很好的方法,因为如果有必要,以后可以很容易地添加更多控件。在我看来,如果第一个组合框中的每个对象都是特定类型的,但每个对象都是具有定义数据类型的属性的相同类型(TierOption),那么这种方法就可以工作。我有什么误解吗?@elo对不起,你是对的!我读得太快了,所以您必须为列表中的每种类型的选项创建一个类(继承自TierOption)。@elo我使用TemplateSelector为您添加了一个解决方案。你可能没有很多其他选择。希望这有帮助@乔纳斯太棒了,就是这样!TemplateSelector是我走的路线。现在,我只需要弄清楚如何动态填充模板组合框,但在提出更多问题之前,我会做这方面的家庭作业。鉴于这是我关于StackOverflow的第一个问题,除了将您的回答标记为解决方案之外,还有什么合适的礼仪?我应该用最终解决方案的代码示例编辑我的原始帖子还是什么?谢谢+我认为这个想法比我最初使用触发器的想法要好。如果控件数量增加,触发器将使其更加困难。拥有不同的datatemplates是一种很好的方法,因为如果有必要,以后可以很容易地添加更多控件。在我看来,如果第一个组合框中的每个对象都是特定类型的,但每个对象都是具有定义数据类型的属性的相同类型(TierOption),那么这种方法就可以工作。我有什么误解吗?@elo对不起,你是对的!我读得太快了,所以您必须为列表中的每种类型的选项创建一个类(继承自TierOption)。@elo我使用TemplateSelector为您添加了一个解决方案。你可能没有很多其他选择。希望这有帮助@乔纳斯太棒了,就是这样!TemplateSelector是我走的路线。现在,我只需要弄清楚如何动态填充模板组合框,但在提出更多问题之前,我会做这方面的家庭作业。鉴于这是我关于StackOverflow的第一个问题,除了将您的回答标记为解决方案之外,还有什么合适的礼仪?我应该用最终解决方案的代码示例编辑我的原始帖子还是什么?谢谢