4

私がこの構造を持っている場合:

public class Parent
{
  public string Name{get; set;}
  public List<Child> Childs {get; set;}
}

public class Child
{
  public string Name{get; set;}
  public int Age {get; set;}
  public bool Married {get; set;}
}

public class ParentFactory
{
   public List<Parent> Parents {get; set;}

   public ParentFactory()
   {
      Child child1 = new Child() {Name="Peter", Age=10, Married=true};
      Child child2 = new Child() {Name="Mary", Age=9, Married=false};
      Child child3 = new Child() {Name="Becky", Age=12, Married=true};

      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 Age}"/>
                    <CheckBox Grid.Column="2" IsChecked="{Binding Married}"/>
            </StackPanel>
        </DataTemplate>
 </Window.Resources>

Stackpanelには、TextBoxとCheckBoxの2種類のコントロールがあります。ただし、より動的にする必要があります。値がブール値の場合は、チェックボックスを使用し、それ以外の場合はテキストボックスを使用します。つまり、Childクラスには多数の属性があるため、StackPanel内でTextBoxまたはCheckboxのいずれかのコントロールを定義する必要はありません。それは可能でしょうか、もしそうなら、どうすればそれらを達成できますか?

4

3 に答える 3

3

DataTemplate動的に変更できます

Xaml

                <DataTemplate>
                    <DataTemplate.Resources>
                        <DataTemplate x:Key="Condition1"></DataTemplate>
                        <DataTemplate x:Key="Condition2"></DataTemplate>
                    </DataTemplate.Resources>                    
                </DataTemplate>
                    <ContentPresenter x:Name="ContentField"
                                      Content="{Binding}"
                                      ContentTemplate="{StaticResource ResourceKey=Condition1}" /> 
                    <DataTemplate.Triggers>
                        <DataTrigger Binding="{Binding Path=IsMarried}" Value="True">
                            <Setter TargetName="ContentField" Property="ContentTemplate" Value="{StaticResource ResourceKey=Condition2}" />
                        </DataTrigger>
                    </DataTemplate.Triggers>   

バインディングを正しく設定してください...そしてDataTemplatesforCondition1Condition2

それが役に立てば幸い :)

于 2012-04-18T08:31:35.753 に答える
2

私はあなたの質問から理解したことから解決策を実行しました。ご覧ください。サンプルはDataTriggerに基づいており、ロジックをConverterに変更できます。

<Window x:Class="StackAnswers.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525"
    xmlns:t="clr-namespace:StackAnswers">


<Window.Resources>
    <DataTemplate DataType="{x:Type t:Parent}">
        <StackPanel Margin="2,2,2,1">
            <Expander Header="{Binding Name}">
                <ItemsControl ItemsSource="{Binding Childs}" />
            </Expander>
        </StackPanel>
    </DataTemplate>
    <DataTemplate DataType="{x:Type t:Child}">
        <StackPanel>
            <TextBlock Text="{Binding Name}"></TextBlock>
            <TextBox Grid.Column="0"
                     Text="{Binding Name}">
                <TextBox.Style>
                    <Style TargetType="{x:Type TextBox}">
                        <Setter Property="Visibility"
                                Value="Collapsed" />
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding Married}" Value="false">
                                <Setter Property="Visibility"
                                        Value="Visible" />
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </TextBox.Style>
            </TextBox>
            <TextBox Grid.Column="1"
                     Text="{Binding Age}">
                <TextBox.Style>
                    <Style TargetType="{x:Type TextBox}">
                    <Setter Property="Visibility"
                            Value="Collapsed" />
                    <Style.Triggers>
                            <DataTrigger Binding="{Binding Married}"
                                     Value="false">
                            <Setter Property="Visibility"
                                    Value="Visible" />
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
                    </TextBox.Style>
            </TextBox>
            <CheckBox Grid.Column="2"
                      IsChecked="{Binding Married}" Content="Married">
                <CheckBox.Style>
                    <Style TargetType="{x:Type CheckBox}">
                        <Setter Property="Visibility"
                                Value="Collapsed" />
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding Married}" Value="True">
                                <Setter Property="Visibility"
                                        Value="Visible"></Setter>
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </CheckBox.Style>
            </CheckBox>
        </StackPanel>
    </DataTemplate>


</Window.Resources>
<DockPanel>
    <ItemsControl ItemsSource="{Binding Parents}">
    </ItemsControl>
</DockPanel>

于 2012-04-18T08:58:00.660 に答える
1

この記事をチェックしてください:http ://www.drwpf.com/blog/Home/tabid/36/EntryID/24/Default.aspx 私はそれがあなたが必要としているものだと思います:

<Page
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:sys="clr-namespace:System;assembly=mscorlib">
  <Page.Resources>
    <DataTemplate DataType="{x:Type sys:Boolean}">
      <CheckBox IsChecked="{Binding Mode=OneWay}" />
    </DataTemplate>
  </Page.Resources>
  <ItemsControl Width="100" Height="100">
    <sys:Int32>30</sys:Int32>
    <sys:DateTime>12/16/1970</sys:DateTime>
    <sys:Boolean>True</sys:Boolean>
    <sys:Boolean>False</sys:Boolean>
    <sys:String>Foo</sys:String>
  </ItemsControl>
</Page>
于 2012-04-18T08:18:02.047 に答える