WPF将TextBox文本属性绑定到TreeView中的特定ViewModel属性

时间:2010-10-24 19:11:50

标签: wpf binding

我有一个TreeView,我绑定到一个名为RootViewModel的ViewModel,它有一个ViewModels ChildViewModel的集合,它有一个ViewModels GrandhChildViewModel的集合。

树视图旁边有一个文本框。

我希望在树中选择GrandChildViewModel时,将文本框的文本绑定到所选项目的特定属性 。如果未选择GrandChildViewModel,我希望文本框中的文本为空。我也想拥有它,如果我在选择GrandChild时更改TextBox中的文本,它将更新树视图中该项目的文本。 (我假设viewmodel< - > textbox和viewmodel< - > treeview

之间的双向绑定
|------------------|
| - Root           |
|   - Child        |     |---------------------------------|
|     - GrandChild |     | Selected GrandChild's Property  |
|     - GrandChild |     |---------------------------------|
|     - GrandChild |                            ^
|   - Child        |                            |
|     - GrandChild |<----- Selected GrandChild -|
|                  |
|------------------|

示例ViewModels:

public class RootViewModel : INotifyPropertyChanged
{
    public ObservableCollection<ChildViewModel> Children{ get; set; }
    public bool IsSelected{ get { /* code */ } set { /* code */ OnPropertyChanged("IsSelected"); }
}
public class ChildViewModel : INotifyPropertyChanged
{
    public ObservableCollection<GrandChildViewModel> GrandChildren{ get; set; }
    public bool IsSelected{ get { /* code */ } set { /* code */ OnPropertyChanged("IsSelected"); }
    public string SomeProperty{ get { /* code */ } set { /* code */ OnPropertyChanged("SomeProperty"); }
}
public class GrandChildViewModel : INotifyPropertyChanged
{
    public bool IsSelected{ get { /* code */ } set { /* code */ OnPropertyChanged("IsSelected"); }
    public bool SomeOtherProperty{ get { /* code */ } set { /* code */ OnPropertyChanged("SomeOtherProperty"); }
}

我在Xaml的尝试到目前为止:

<TextBox>
    <TextBox.Style>
        <Style TargetType="TextBox">
            <Style.Triggers>
                <DataTrigger Value="True">
                    <DataTrigger.Binding>
                         <Binding Converter="{StaticResource myConverter}" ElementName="myTreeView" Path="SelectedItem" Mode="TwoWay" />
                    </DataTrigger.Binding>
                    <DataTrigger.Setters>
                        <Setter Property="Text" Value="{Binding Path=SomeOtherProperty}" />
                    </DataTrigger.Setters>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </TextBox.Style>
</TextBox>

也试过

<TextBox Text={Binding ElementName=myTreeView, Path=SelectedItem, Converter={StaticResource myConverter}, Mode=TwoWay}" />

非常感谢提前。

更新

我发现这是抛出异常,因为不允许在SelectedItem上使用TwoWay DataBinding。

1 个答案:

答案 0 :(得分:1)

感谢this post我能够让它发挥作用。我在文本框周围设置StackPanel以绑定到所选项目,然后将文本框绑定到我关心的属性。

<StackPanel DataContext={Binding ElementName=myTreeView, Path=SelectedItem}">
    <TextBox Text={Binding Path=SomeOtherProperty, Mode=TwoWay}" />
</StackPanel>

像魅力一样。