仅当其他TreeViewItem的子项时,DataBinding才能选择TreeViewItem

时间:2011-07-11 13:19:27

标签: wpf treeview binding observablecollection treeviewitem

我有一个自定义类(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的子代,那么如何将文本框绑定到选定的项属性(或数据绑定类属性)

提前谢谢你 奥利弗

2 个答案:

答案 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中设置路径,绑定模式和更新源触发器,以便只需要更新数据上下文。

由于 奥利弗