Использование HierarchicalDataTemplate.Triggers для воздействия на элементы управления в ItemTemplate - PullRequest
3 голосов
/ 19 августа 2009

У меня есть TreeView с HierarchicalDataTemplate (показано ниже), связанным с отношением данных в наборе данных. Родительские узлы представляют родительские части, а дочерние - части, составляющие родительский. В некоторых случаях пользователь установит флажок на родительском уровне, чтобы указать, что он заменяет всю деталь всеми ее дочерними элементами. В этот момент появится текстовое поле для ввода нового номера детали для родителя. Пока у меня это работает.

Мне нужна помощь, чтобы скрыть детей, когда установлен флажок родителей. Я подходил к этому по пути триггера, но я не могу сделать ссылку на какой-либо из элементов управления в ItemTemplate из триггера в HierarchicalDataTemplate.Triggers. Возможно, это невозможно?

<HierarchicalDataTemplate ItemsSource="{Binding MyParts}">
    <StackPanel Orientation="Horizontal">
        <TextBlock Text="{Binding Description}" />
        <CheckBox x:Name="MyCheckBox" IsChecked="{Binding ReplaceParent}"></CheckBox>
        <TextBox x:Name="NewParentPartNumberTextBox" Text="{Binding NewPartNumber}" Visibility="Collapsed"></TextBox>
    </StackPanel>
    <HierarchicalDataTemplate.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="{Binding ChildPartNumber}" />
                <TextBox Text="{Binding NewChildPartNumber}" />
            </StackPanel>
        </DataTemplate>
    </HierarchicalDataTemplate.ItemTemplate>
    <HierarchicalDataTemplate.Triggers>
        <Trigger SourceName="MyCheckBox" Property="IsChecked" Value="True">
            <Setter TargetName="NewParentPartNumberTextBox" Property="Visibility" Value="Visible"/>
        </Trigger>
    </HierarchicalDataTemplate.Triggers>
</HierarchicalDataTemplate>

1 Ответ

0 голосов
/ 14 ноября 2012

Это не только XAML-подход, но он может удовлетворить ваши потребности:

Скажите, что ваш ViewModel / class-that-is-be-bound-to-your-parent-item выглядит так:

public class ItemViewModel
{
    public bool ReplaceParent {get; set;}
    public ObservableCollection<ItemViewModel> MyParts {get; set;}
}

Вы могли бы попробовать что-то вроде:

public class ItemViewModel
{
    private bool _replaceParent;
    private ObservableCollection<ItemViewModel> _originalParts = ....;
    public bool ReplaceParent 
    {
        get { return _replaceParent; }
        set
        {
            MyParts = value ? 
                      new ObservableCollection<ItemViewModel>() :
                      _originalParts;
            // omit: any property changed logic    
        }
    }
    public ObservableCollection<ItemViewModel> MyParts  {get; set;}
}

По сути, замените коллекцию детей пустым списком, пока у вас установлен флажок.

...