【问题标题】:How do I access a windows control (checkbox) that is created dynamically in a WPF treeview?如何访问在 WPF 树视图中动态创建的 Windows 控件(复选框)?
【发布时间】:2012-10-20 05:12:01
【问题描述】:

我有一个带有分层数据模板的 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,我无法通过绑定为它们分配一个,因为这是不允许的。

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

【问题讨论】:

    标签: wpf dynamic navigation treeview controls


    【解决方案1】:

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

    如果您不想在数据模型中引入与 UI 相关的逻辑(例如我提到的 IsChecked 属性),则必须在模型和视图之间引入 ViewModel。

    【讨论】:

    • 另一个问题..所以这在层次树没有展开时有效。因此,如果我加载数据,将特定的布尔值更改为 true,然后展开树,一切正常并选中复选框。如果树已展开并且我可以直观地看到它们,则不会选中这些框。你知道为什么会这样吗?
    • 或者更具体地说,如何使用通过复选框更改的依赖项和触发属性?我已经在我的 UI 中将它与一个字符串一起使用并让它工作,但是使用复选框呢?
    • 我认为 DependencyProperties 不属于 ViewModel。您应该利用 INotifyPropertyChandged。见wpftutorial.net/INotifyPropertyChanged.html
    • ViewModels(或只是普通数据)中的 DependencyProperties 的问题是您必须从 DependencyObject 派生您的对象,并且它们获得线程亲和性,这对数据和 ViewModels 都不是一件好事。
    • 我像以前一样使用了 INotifyPropertyChanged,它有点工作,问题是:如果我不展开树(所以我可以看到框)我加载一些布尔值,然后加载一些不同的,并继续这样做然后扩展,适当地检查这些框。一旦我展开并直观地看到这些框,从那里加载并不会在视觉上更新框,无论它们是否在视图中展开。知道为什么展开和直观地看到这些框会结束任何视觉更新吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-04
    • 1970-01-01
    • 1970-01-01
    • 2013-06-02
    • 2011-01-24
    • 1970-01-01
    • 2011-07-03
    相关资源
    最近更新 更多