【问题标题】:Binding TreeView selection to ViewModel将 TreeView 选择绑定到 ViewModel
【发布时间】:2011-02-28 21:13:06
【问题描述】:

所以我有一个看起来像这样的 TreeView:

<TreeView   Name="elementTreeView"
                        ItemsSource="{Binding Elements}" 
                        Width="Auto"
                        SelectedValuePath="Path" />

我还有一个 TextBlock 定义如下:

<TextBlock Text="{Binding ElementName=elementTreeView, Path=SelectedValue}" />

我的 ModelView 非常基本,并且包含您所期望的内容。我正在寻找一种将 ViewModel 中的属性绑定到 SelectedValue 的方法。现在,文本块显示了我需要的内容。有没有简单的方法来绑定这个属性?

【问题讨论】:

  • 不完全确定您在问什么。您希望 TreeView 更新 VM 的 SelectedValue 属性,还是让 VM 的 SelectedValue 属性更新 TreeView?
  • 对不起,如果我的问题不是很容易理解。我还是 WPF 的新手。我希望 TreeView 更新 VM 的 SelectedValue 属性。我也尝试通过使用绑定而不是 SelectedItemChanged 事件来正确维护 MVVM 模式。

标签: wpf binding


【解决方案1】:

所以事实证明这是没有完全正确地遵循 MVVM 模式的结果。解决方案是只使用一个 ViewModel 对象。在 ViewModel(其类型是 ElementViewModel)对象内部,我有类似的东西:

public ElementViewModel Element {
    get {
        return this;
    }
}

然后我的 TreeView 声明看起来像这样:

<TreeView   Name="treeView" 
            ItemsSource="{Binding Elements}" 
            Width="Auto"
            SelectedValuePath="Element" />

在那之后,我所要做的就是在另一个视图中绑定到 Element。

【讨论】:

    【解决方案2】:

    您可以直接将 TreeView 绑定到 ViewModel 上的属性:

    这将绑定到 VM 中的“SelectedItem”属性。

    <TreeView   Name="elementTreeView"
                        ItemsSource="{Binding Elements}" 
                        SelectedValue="{Binding SelectedItem, Mode=OneWayToSource}"
                        Width="Auto"
                        SelectedValuePath="Path" />
    

    【讨论】:

    • 当我尝试这样做时,我收到以下构建错误:“SelectedValue”属性是只读的,不能从标记中设置。
    • @helixed: 抱歉 - 它应该是 onewaytosource
    【解决方案3】:

    您可以使用OneWayToSource 的BindingMode 将TreeView 的SelectedValue 属性绑定到您的ViewModel。然后使用 OneWay 绑定将 TextBlock 的 Text 属性绑定到相同的 ViewModel 属性。

    【讨论】:

    • 问题好像是SelectedValue是只读的,所以不让我直接绑定。
    • OneWayToSource 绑定模式允许您解决只读和非依赖属性;这就是我建议的原因。即使 MVVM 实现不好,这种技术也可以工作。
    猜你喜欢
    • 2014-08-06
    • 1970-01-01
    • 1970-01-01
    • 2013-05-25
    • 2021-11-22
    • 2012-04-23
    • 2011-04-29
    • 2011-05-20
    • 1970-01-01
    相关资源
    最近更新 更多