对枚举类型使用复选框或文本框

本文关键字:文本 复选框 枚举 类型 | 更新日期: 2023-09-27 18:31:25

如果我有这个结构:

public class Parent
{
  public string Name{get; set;}
  public List<Child> Childs {get; set;}
}
public class Child
{
  public string Name{get; set;}
  public string Value{get; set;}
  public enum ValueType {get; set;}
}
public enum ValueType
{
    Int,
    Boolean,
    String
};
public class ParentFactory
{
   public List<Parent> Parents {get; set;}
   public ParentFactory()
   {
      Child child1 = new Child() {Name="Filter1", Value="1", ValueType=ValueType.String};
      Child child2 = new Child() {Name="isExecuted", Value="true", ValueType=ValueType.Boolean};
      Child child3 = new Child() {Name="Width", Value="10", ValueType=ValueType.Int};
      Parent parent1 = new Parent(){Name="Adam", Childs = new List<Child>(){child1, child2}};
      Parent parent2 = new Parent(){Name="Kevin", Childs = new List<Child>(){child3}};
      Parents = new List<Parent>(){parent1, parent2};
   }
}

我想将对象:ParentFactory parentFactory = new ParentFactory()绑定到项目控件:

<DockPanel>
    <ItemsControl ItemsSource="{Binding Parents}">
    </ItemsControl>
</DockPanel>
 <Window.Resources>
     <DataTemplate DataType="{x:Type Parent}">
         <StackPanel Margin="2,2,2,1">
              <Expander Header="{Binding Name}">
                  <ItemsControl ItemsSource="{Binding Childs}" />
              </Expander>
         </StackPanel>
     </DataTemplate>
        <DataTemplate DataType="{x:Type Child}">
            <StackPanel>
                    <TextBox Grid.Column="0" Text="{Binding Name}" />
                    <TextBox Grid.Column="1" Text="{Binding Value}"/>
                    <TextBox Grid.Column="2" Text="{Binding ValueType}"/>
            </StackPanel>
        </DataTemplate>
 </Window.Resources>

在堆栈面板中,有一个控件:文本框。但是,我希望它更加动态:如果 ValueType 是布尔值,则使用复选框,否则使用文本框表示:<TextBox Grid.Column="1" Text="{Binding Value}"/>

这是否可能,如果是,我该如何实现?

对枚举类型使用复选框或文本框

您可以动态更改DataTemplate

哈姆勒

                <DataTemplate>
                    <DataTemplate.Resources>
                        <DataTemplate x:Key="Condition1">
                           <TextBox></TextBox> // Do you binding
                        </DataTemplate>
                        <DataTemplate x:Key="Condition2">
                           <CheckBox></CheckBox> // Do you binding
                        </DataTemplate>
                    </DataTemplate.Resources>                    
                </DataTemplate>
                    <ContentPresenter x:Name="ContentField"
                                      Content="{Binding}"
                                      ContentTemplate="{StaticResource ResourceKey=Condition1}" /> 
                    <DataTemplate.Triggers>
                        <DataTrigger Binding="{Binding Path=ValueType}" Value="1">
                            <Setter TargetName="ContentField" Property="ContentTemplate" Value="{StaticResource ResourceKey=Condition2}" />
                        </DataTrigger>
                    </DataTemplate.Triggers>   

请务必正确设置绑定...并为Condition1Condition2制作DataTemplates

希望对:)有所帮助

我认为最简单的方法是将它们都放在您的面板中并定义两个新的布尔属性,这些属性将通过布尔可见性ValueConverter来控制它们的Visibility

public bool IsValueTypeBoolean
{
    get
    {
         ...Conditions that will return true for CheckBox.
    }
}
public bool IsValueTypeOther
{
    get
    {
         return !this.IsValueBoolean;
    }
}
<TextBox Grid.Column="2" Visibility="{Binding IsValueTypeOther, Converter={StaticResource visibilityConverter}}"/> 
<CheckBox Grid.Column="2" Visibility="{Binding IsValueTypeBoolean, Converter={StaticResource visibilityConverter}}"/> 

布尔到可见性转换器

[ValueConversion(typeof(bool), typeof(Visibility))]
public class BooleanToVisibilityConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        bool myValue = (bool)value;
        if (myValue)
            return Visibility.Visible;
        else
            return Visibility.Collapsed;
    }
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

将此资源作为资源添加到 XAML:

 <local:BooleanToVisibilityConverter x:Key="visibilityConverter"></local:VisibilityConverter>

我希望没有错别字...