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 という 1 つのコントロールがあります。ただし、もっと動的にしたい: ValueType がブール値の場合は 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 を介してそれらを制御する 2 つの新しいブール プロパティを定義することだと思います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}}"/> 

ブール値から 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 に答える