0

如果我有这个结构:

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()到 ItemsControl:

<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>

在 Stackpanel 中,有一个控件:TextBox。但是,我希望它更加动态:如果 ValueType 是 Boolean ,则使用 Checkbox ,否则使用 Textbox :<TextBox Grid.Column="1" Text="{Binding Value}"/>

这可能吗,如果可以,我该如何实现?

4

2 回答 2

2

您可以DataTemplate动态更改

Xaml

                <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>   

确保正确设置绑定......并制作DataTemplatesforCondition1Condition2

希望能帮助到你 :)

于 2012-04-18T10:01:44.027 回答
1

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

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}}"/> 

Boolean 到 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>

希望没有错别字...

于 2012-04-18T10:02:01.577 回答