0

我有一个带有分层数据模板的 WPF 树视图,可以加载对象并很好地显示它们。在树视图的子视图中,我使用文本块在树视图中显示对象的“名称”,旁边还有一个复选框。这是我的参考代码:

<DockPanel Name="test1" Margin="10,10,0,10" VerticalAlignment="Stretch" Grid.Row="3" Grid.RowSpan="7" Grid.Column="0">
        <DockPanel.Resources>
            <local:CheckBoxCommand x:Key="cbc"></local:CheckBoxCommand>
            <src:TreeViewFilter x:Key="MyList" />

            <HierarchicalDataTemplate DataType="{x:Type src:TreeViewParent}" ItemsSource="{Binding Path=OrderAttributes}">
                <TextBlock Text="{Binding Path=NameAndCount}" FontSize="24"/>
            </HierarchicalDataTemplate>

            <HierarchicalDataTemplate DataType="{x:Type src:OrderAttribute}" ItemsSource="{Binding Path=OrderAttributes}">
                <StackPanel Name="test" Orientation="Horizontal" VerticalAlignment="Center">
                    <CheckBox Command="{StaticResource cbc}"
                              CommandParameter="{Binding Path=NameAndParent}" Visibility="{Binding Path=CheckBoxVisible}" VerticalAlignment="Center">
                    </CheckBox>
                    <TextBlock Text="{Binding Path=NameAndCount}" FontSize="16"/>
                    </StackPanel>
            </HierarchicalDataTemplate>

        </DockPanel.Resources>
        <TreeView Name="treeView1" BorderThickness="2" ItemsSource="{Binding Source={StaticResource MyList}, UpdateSourceTrigger=PropertyChanged}" TreeViewItem.Selected="filterByBatchStatus"/>
    </DockPanel>

当用户选中树中的复选框时,我的应用程序中会根据选中的复选框发生某些事情。我知道正在检查哪个复选框的方法是通过命令传递参数,并且该参数绑定到对象的“NameAndParent”。所有这一切都很好。

当我让用户选择保存已选中的复选框并将复选框旁边的每个对象的“名称”保存到 XML 中时,我的问题就开始了。如您所见,我只保存了对象的“名称”,但该名称没有与复选框挂钩,因此我无法返回并“找到”关联的复选框。

当我让用户选择加载这些已保存文件之一时,我想遍历树并选中已保存的框。问题是复选框没有名称或 UID,我无法通过绑定为它们分配一个,因为这是不允许的。

无论如何要遍历树视图并以某种方式将保存的名称与树中每个元素子元素的名称进行比较,然后选中该特定复选框,或者这是否必须以不同的方式进行编程?

4

1 回答 1

1

只需在包含您的数据的类中创建一个布尔 IsChecked 属性,并将 CheckBox.IsChecked 绑定到该属性。无需操作视图,您可以更轻松地操作它所绑定的数据,无需花哨的 Visual-Tree 操作,并消除应用程序逻辑和 UI 之间的依赖关系。这是 Model-View-ViewModel 模式最重要的实现。

如果你不想在你的数据模型中引入 UI 相关的逻辑(比如我提到的 IsChecked 属性),你将不得不在模型和视图之间引入一个 ViewModel。

于 2012-10-30T20:00:17.030 回答