Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Silverlight 如何将TreeViewItem.IsExpanded数据绑定到节点数据对象_Silverlight_Data Binding_Treeview_Silverlight Toolkit - Fatal编程技术网

Silverlight 如何将TreeViewItem.IsExpanded数据绑定到节点数据对象

Silverlight 如何将TreeViewItem.IsExpanded数据绑定到节点数据对象,silverlight,data-binding,treeview,silverlight-toolkit,Silverlight,Data Binding,Treeview,Silverlight Toolkit,我有一个分层的数据类,比如 public class MyNode { public string Name { get; set;} public bool IsExpanded { get; set;} public List<MyNode> Nodes { get; set;} } 公共类MyNode { 公共字符串名称{get;set;} 公共布尔展开{get;set;} 公共列表节点{get;set;} } 我可以定义一个HierarchycalDa

我有一个分层的数据类,比如

public class MyNode 
{
   public string Name { get; set;}
   public bool IsExpanded { get; set;}
   public List<MyNode> Nodes { get; set;}
}
公共类MyNode
{
公共字符串名称{get;set;}
公共布尔展开{get;set;}
公共列表节点{get;set;}
}
我可以定义一个HierarchycalDataTemplate来将MyNode类绑定到TreeView

<sdk:TreeView ItemsSource="{Binding RootNodes}">
  <sdk:TreeView.ItemTemplate>
    <sdk:HierarchicalDataTemplate ItemsSource="{Binding Nodes}">
      <TextBlock Text="{Binding Name}" />
    </sdk:HierarchicalDataTemplate>
  </sdk:TreeView.ItemTemplate>
</sdk:TreeView>

问题是如何将TreeViewItem的IsExpanded属性数据绑定到相应的MyNode.IsExpanded属性,这样我就可以保留这些信息

提前谢谢大家,,
Lex

我不确定这在Silverlight中是否有效,但在WPF中,您可以使用以下样式绑定到
IsExpanded

<sdk:TreeView ItemsSource="{Binding RootNodes}">
    <sdk:TreeView.Resources>
        <Style TargetType="TreeViewItem">
            <Setter Property="IsExpanded" Value="{Binding Path=IsExpanded, Mode=TwoWay}" />
        </Style>
    </sdk:TreeView.Resources>
    <sdk:TreeView.ItemTemplate>
        <sdk:HierarchicalDataTemplate ItemsSource="{Binding Nodes}">
            <TextBlock Text="{Binding Name}" />
        </sdk:HierarchicalDataTemplate>
    </sdk:TreeView.ItemTemplate>
</sdk:TreeView>

如果我们像这样重写TreeView和TreeView项目类,这是可能的:

public类ExTreeView:System.Windows.Controls.TreeView
{
受保护的覆盖依赖对象GetContainerForItemOverride()
{
返回新的ExTreeViewItem();
}
}

公共类ExTreeViewItem:System.Windows.Controls.TreeViewItem { 公共ExTreeViewItem() { SetBinding(IsExpandedProperty,新绑定(“IsExpanded”){Mode=BindingMode.TwoWay}); }

受保护的覆盖依赖对象GetContainerForItemOverride() { 返回新的ExTreeViewItem(); } }


然后使用ExTreeView而不是TreeView,它会自动将数据绑定到分层数据项的IsExpanded属性。

我不得不处理同样的问题,我采用了MVVM方法

首先,您希望创建一个属性,该属性表示该项是否在视图模型中展开(这主要是MVVM帮助您解决的问题)

在节点的视图模型中,只需添加类似于
布尔IsNodeExpanded{get;set;}

的内容即可 警告:以上只是界面!您必须使用
INotifyPropertyChanged.PropertyChanged
通知更改,否则它将无法工作

接下来,你想把它和你的观点联系起来,这和安迪的建议非常相似;使用样式。然而,他的标记对我来说还不够(一个原因是它不起作用)。
实际上,您要做的是将样式放置在树视图的
ItemContainerStyle

<TreeView ...>
    <TreeView.ItemContainerStyle>
        <Style TargetType="TreeViewItem">
            <Setter Property="IsExpanded" Value="{Binding Path=IsNodeExpanded, Mode=TwoWay}" />
        </Style>
    </TreeView.ItemContainerStyle>
</TreeView>

在我的情况下,这确实对我起了作用


注1:省得自己头疼,并确保上述样式中的绑定是双向的。前一段时间我有一个项目,当我不得不重新做这个时,我忘了让它成为双向的,甚至调试也没有帮助


注2:这个函数应该使用MVVM,我曾尝试使用代码隐藏,因为它看起来比较短(我很懒),而且结果很长,不仅因为它需要一个递归函数,还因为隐藏项在父项打开之前似乎不存在这并不令人愉快,而且这似乎是一种快速的方法,但我的经验让它变得更长。

这也是我的第一个猜测:)但不,它在Silverlight中不起作用。
<TreeView ...>
    <TreeView.ItemContainerStyle>
        <Style TargetType="TreeViewItem">
            <Setter Property="IsExpanded" Value="{Binding Path=IsNodeExpanded, Mode=TwoWay}" />
        </Style>
    </TreeView.ItemContainerStyle>
</TreeView>