2012-04-18 3 views
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. Тем не менее, я хочу, чтобы они были более динамичными: если значение является логическим, то используйте флажок и еще используйте текстовое поле. Это означает, что мне не нужно определять элемент управления TextBox или Checkbox внутри StackPanel из-за множества атрибутов в моем классе Child. Было бы возможно, и если да, то как я могу их достичь?

+1

вы имеете в виду, если Bool = верно, то флажок или Textbox .. ?? Если это так, вы можете использовать триггеры в DataTemplate – Ankesh

+0

yes, свойство (Married) является логическим, а затем использует флажок. Иначе используйте текстовое поле. – olidev

+0

@ adcool2007 Не могли бы вы предоставить пример кода о том, как использовать триггеры в Datatemplate? Спасибо – olidev

ответ

2

Я сделал решение от того, что я понял из вашего вопроса. Пожалуйста, взгляните на это. Образец основан на DataTrigger, и вы можете изменить логику на Конвертер.

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

+0

Kumar: Вы здорово! Это работает, как я спросил. Тем не менее, я не знал о моем вопросе по моему делу. Я просто открыл здесь еще один вопрос: http://stackoverflow.com/questions/10206718/using-either-checkbox-or-textbox-for-an-enum-type Я думаю, что это более сложная задача. Если у вас есть время, пожалуйста, помогите мне еще раз? Большое спасибо! – olidev

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

в Обязательно установите привязок правильно ... и сделайте DataTemplates для Condition1 и Condition2

надеюсь, что это помогает :)