将TreeView的选中项绑定到ViewModel

7

我有一个类似于这样的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? - hemp
抱歉,如果我的问题不太容易理解。我还是WPF的新手。我想要TreeView更新VM的SelectedValue属性。我也试图使用绑定而不是SelectedItemChanged事件来正确维护MVVM模式。 - LandonSchropp
3个回答

4

原来这是由于没有正确地遵循MVVM模式而导致的结果。解决方案是只使用一个ViewModel对象。在ViewModel(其类型为ElementViewModel)对象内部,我有类似以下内容的代码:

public ElementViewModel Element {
    get {
        return this;
    }
}

那么我的TreeView声明大致如下:

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

之后,我需要在其他视图中将Element绑定。

0

你可以使用OneWayToSource作为BindingMode将TreeView的SelectedValue属性绑定到ViewModel中。然后,使用单向绑定将TextBlock的Text属性绑定到相同的ViewModel属性。


问题似乎在于SelectedValue是只读的,因此它不允许我直接绑定它。 - LandonSchropp
OneWayToSource绑定模式允许您解决只读和非依赖属性的问题;这就是我建议使用它的原因。即使MVVM实现不佳,这种技术也可以发挥作用。 - hemp

-2
您可以直接将TreeView绑定到ViewModel上的属性:
这将绑定到VM中的“SelectedItem”属性。
<TreeView   Name="elementTreeView"
                    ItemsSource="{Binding Elements}" 
                    SelectedValue="{Binding SelectedItem, Mode=OneWayToSource}"
                    Width="Auto"
                    SelectedValuePath="Path" />

当我尝试这样做时,我会得到以下构建错误:'SelectedValue' 属性是只读的,不能从标记设置。 - LandonSchropp
@helixed:抱歉 - 应该是 onewaytosource。 - Reed Copsey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接