2016-07-14 3 views
1

Как я могу изменить ребенка ItemsControl на основании имущества ребенка?ItemsControl - другой ребенок, основанный на собственности

На данный момент у меня есть это ItemsControl:

<ItemsControl ItemsSource="{Binding FooBar}"> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <Grid> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="*"/> 
        <ColumnDefinition Width="*"/> 
        <ColumnDefinition Width="*"/> 
       </Grid.ColumnDefinitions> 

       <TextBox Text="{Binding FirstName}" Grid.Column="0"/> 
       <TextBox Text="{Binding LastName}" Grid.Column="1"/> 
       <TextBox Text="{Binding Age}" Grid.Column="2"/> 
      </Grid> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

Этот ItemsControl связан с ObservableCollection называется FooBar. Каждый объект внутри ObservableCollection обладает теми же свойствами. 3 из 4 объекта привязаны к ItemsControl. Свойство foruth называется deletable и имеет тип bool. Теперь я хочу проверить это свойство. Если deletable == true, я хочу увидеть другой ItemsControl.ItemTemplate.

<ItemsControl.ItemTemplate> 
    <DataTemplate> 
     <Grid> 
      //... 
     </Grid> 
    </DataTemplate> 
</ItemsControl.ItemTemplate> 

Как я могу переключаться между двумя ItemsControl.ItemTemplate - с обязаны OberservableCollection - на основе Собственость?

+0

Как может четвертое свойство коллекции повлиять на то, как это делается? Если у вас есть 2 объекта в 'FooBar', а' FooBar [0] 'говорит' false', а 'FooBar [1]' говорит 'true', то какой шаблон он должен использовать? – Jai

+0

@Jai Я думал, что объект загружен первым, а затем отображается. Чтобы я мог посмотреть на свойство 'deletable' между этими двумя процессами и выбрать, на каком шаблоне он должен отображаться. – MyNewName

+1

Есть ли разница между двумя разными шаблонами, которые вы хотите показать? Я предполагаю, что 'deletable', установленный в' true', просто предоставит кнопку удаления? Если это так, вы можете показать/скрыть кнопку удаления на основе этого свойства. – Bijington

ответ

1

Все, что вам нужно сделать, это показать/скрыть кнопку «Удалить» на основе вашего свойства.

Попробуйте что-то долго эти строки:

<ItemsControl ItemsSource="{Binding FooBar}"> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <Grid> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="*"/> 
        <ColumnDefinition Width="*"/> 
        <ColumnDefinition Width="*"/> 
        <ColumnDefinition Width="Auto"/> 
       </Grid.ColumnDefinitions> 

       <TextBox Text="{Binding FirstName}" Grid.Column="0"/> 
       <TextBox Text="{Binding LastName}" Grid.Column="1"/> 
       <TextBox Text="{Binding Age}" Grid.Column="2"/> 
       <Button Content="X" Grid.Column="3" Command="{Binding YOURDELETECOMMAND}" 
         Visibility="{Binding Deletable, Converter={StaticConverter BooleanToVisibilityConverter}}"/> 
      </Grid> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

Примечание, также необходимо сделать следующее заявление в ваших ресурсах

<BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/> 

Alternative команда Удалить подход

вышеприведенной команды связывание воли ожидайте, что YOURDELETECOMMAND будет определен в вашем классе FooBar, если вы предпочитаете обрабатывать d eletion выше (я собираюсь взять здесь MVVM). Как сказал Jai в комментариях, это рекомендуемый способ сделать это, поскольку вы можете напрямую получить доступ к своему ObservableCollection и удалить этот предмет.

<Button Content="X" Grid.Column="3" Command="{Binding DataContext.YOURDELETECOMMAND, RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type vw:YOURVIEW}}}" 
         Visibility="{Binding Deletable, Converter={StaticConverter BooleanToVisibilityConverter}}"/> 

Примечание. Вам потребуется это объявление в корне вашего Xaml.

xmlns:vw="NAMESPACE_OF_YOUR_VIEW" 
+2

На самом деле, лучший способ - заставить команду «Command» удалить эту запись непосредственно из коллекции 'FooBar'. – Jai

+0

Спасибо за ответ! Это поможет мне много. Могу ли я изменить свойство «IsEnabled» в текстовом поле? – MyNewName

+0

@Jai Хорошая точка! Я обновил ответ, чтобы включить эту опцию. – Bijington

Смежные вопросы