3

我有TreeView一个HierarchicalDataTemplate(如下所示)绑定到数据集中的数据关系。父节点代表父零件,子节点代表构成父零件的零件。在某些情况下,用户将选中父级的复选框,以表明他们正在用所有子级替换整个部分。此时将出现一个文本框,供他们输入父级的新零件编号。到目前为止,我有这个工作。

我需要帮助的是,在选中父复选框时隐藏子项。我一直在从触发器路径处理这个问题,但我似乎无法从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>
4

1 回答 1

0

这不是仅 XAML 的方法,但它可能适合您的需求:

假设您的 ViewModel/class-that-is-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;}
}

基本上,当您选中复选框时,将子集合换成空列表。

于 2012-11-14T19:10:25.437 回答