我有一个自定义类(NewBlockLabelInfo),带有另一个自定义类(DoorControllerLabelInfo)的可观察集合我已成功将NewBlockLabelInfo类数据绑定到树视图,一切都显示正常。
我有很多文本框是绑定到某些属性的数据,更新这些文本框会反映在树视图中。
我想将属性的一组文本框数据绑定到树视图中的选定项目,如果所选项目是指定的treeviewitem的子项(Observable Collection,Door Controllers)
数据上下文在窗口级别指定。
我看起来很长很难以做到这一点,更不用说最好的方式了。
继承了TreeView的WPF XAML
<TreeView Margin="12,150,582,16" Name="treeView1">
<TreeViewItem Header="{Binding Path=BlockName}" Style="{StaticResource BlockItem}" IsExpanded="True">
<TreeViewItem Style="{StaticResource PhoneNoItem}" Header="{Binding Path=TelephoneNumber}"/>
<TreeViewItem Style="{StaticResource DataNoItem}" Header="{Binding Path=DataNumber}"/>
<TreeViewItem Style="{StaticResource CompanyItem}" Header="{Binding Path=CompanyName}"/>
<TreeViewItem Style="{StaticResource ConnectedItem}" Header="{Binding Path=ConnectedDC}" />
<TreeViewItem IsExpanded="True" Header="Door Controllers" Foreground="#FF585858" ItemsSource="{Binding Path=DoorControllers, UpdateSourceTrigger=PropertyChanged}" Name="DCTreeViewItem" Selected="DCTreeViewItem_Selected">
<TreeViewItem.ItemTemplate>
<HierarchicalDataTemplate>
<TreeViewItem Header="{Binding Path=DCName}" Style="{StaticResource DCItem}" IsExpanded="True" Selected="DCTreeViewItem_Selected" >
<TreeViewItem Header="{Binding Path=Address}" Style="{StaticResource AddressItem}" />
<TreeViewItem Header="{Binding Path=Channel1}" Style="{StaticResource Door1Item}" />
<TreeViewItem Header="{Binding Path=Channel2}" Style="{StaticResource Door2Item}" />
</TreeViewItem>
</HierarchicalDataTemplate>
</TreeViewItem.ItemTemplate>
</TreeViewItem>
<TreeViewItem IsExpanded="True" Header="Flats" Foreground="#FF585858" ItemsSource="{Binding Path=FlatNames, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}">
<TreeViewItem.ItemTemplate>
<DataTemplate>
<TreeViewItem Header="{Binding}" Style="{StaticResource FlatsItem}" IsExpanded="True">
</TreeViewItem>
</DataTemplate>
</TreeViewItem.ItemTemplate>
</TreeViewItem>
</TreeViewItem>
</TreeView>
如果TreeViewItem是门控制器TreeViewItem的子代,那么如何将文本框绑定到选定的项属性(或数据绑定类属性)
提前谢谢你 奥利弗
答案 0 :(得分:0)
最好的方法是定义一个DataTemplate选择器,并创建几个datatemplates。选择器可以评估所有类型的逻辑规则,并返回所需的模板。
这是一个非常好的入门tutorial on DataTemplateSelectors。
在重新阅读你的问题之后我就得到了。
您的模型类是否具有导航属性以获取父对象?如果是这样,您可以在ViewModel上使用触发器(或者,如果您使用的是MVVM),则可以根据父对象而不是父TreeViewItem启用/禁用/更改可见性。以您描述的方式访问可视化树有点困难。
答案 1 :(得分:0)
我自己通过为每个我关心的子TreeViewItem添加一个事件处理程序来解决这个问题。有了这个,我就可以从中获取DataContext,并将其设置为TextBoxs的DataContext,并创建自己的绑定。
由于DataContext检索是通过引用完成的,而不是通过值完成的。
以下是单击其中一个子节点时所关注的事件处理程序:(原谅临时命名)
private void DCTreeViewItem_Selected(object sender, RoutedEventArgs e)
{
TreeViewItem currentItem = (TreeViewItem)e.OriginalSource;
textBox5.DataContext = ((DoorControllerLabelInfo)currentItem.DataContext);
Binding b = new Binding("DCName");
b.Mode = BindingMode.TwoWay;
b.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
BindingOperations.SetBinding(textBox5, TextBox.TextProperty, b);
}
由此,我在XAML中设置路径,绑定模式和更新源触发器,以便只需要更新数据上下文。
由于 奥利弗