0

我有一个自定义类 (NewBlockLabelInfo) 和另一个自定义类 (DoorControllerLabelInfo) 的可观察集合我已经成功地将 NewBlockLabelInfo 类数据绑定到树视图,并且一切都显示正常。

我有很多文本框是绑定到某些属性的数据,并且更新这些会反映在树视图中。

我想将属性的一组文本框数据绑定到树视图中的选定项目,如果所选项目是指定树视图项的子项(可观察集合,门控制器)

数据上下文在窗口级别指定。

我一直在寻找一种方法来做到这一点,更不用说最好的方法了。

这是 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 的选定项属性(或数据绑定类属性)

提前谢谢你奥利弗

4

2 回答 2

0

我自己解决了这个问题,方法是为我关心的每个子 TreeViewItem 添加一个单击事件处理程序。有了这个,我可以从中获取 DataContext,并将其设置为 TextBox 的 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 中设置路径、绑定模式和更新源触发器,以便只需要更新数据上下文。

谢谢奥利弗

于 2011-07-12T10:06:06.710 回答
0

最好定义一个 DataTemplate 选择器并创建多个数据模板。选择器可以评估各种逻辑规则,并返回您想要的模板。

这是关于 DataTemplateSelectors 的一个很好的入门教程

编辑

在这里重读你的问题后,我得到了。

您的模型类是否具有导航属性以访问父对象?如果是这样,您可以在 ViewModel 上使用触发器(或者如果您使用 MVVM,则更可取)属性来启用/禁用/更改基于父对象而不是父 TreeViewItem 的可见性。以您描述的方式访问可视化树有点困难。

于 2011-07-11T14:04:51.617 回答