我有一个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。
答案 0 :(得分:1)
感谢this post我能够让它发挥作用。我在文本框周围设置StackPanel以绑定到所选项目,然后将文本框绑定到我关心的属性。
<StackPanel DataContext={Binding ElementName=myTreeView, Path=SelectedItem}"> <TextBox Text={Binding Path=SomeOtherProperty, Mode=TwoWay}" /> </StackPanel>
像魅力一样。