WPF:为所有TreeViewItem实例设置绑定

时间:2009-11-21 02:27:42

标签: wpf mvvm styles treeviewitem itemcontainerstyle

问候,

我正在使用带有Model-View-ViewModel模式的WPF,我有一个IsSelected属性的视图模型,我希望将其绑定到TreeViewItem的{​​{1}}范围内所有IsSelected的属性。我正在尝试使用TreeViewItemStyle执行此操作。这显然适用于根级Setter,但不适用于他们的孩子。为什么是这样?如何才能将其应用于所有TreeViewItem控件?

以下是XAML的观点:

TreeViewItem

3 个答案:

答案 0 :(得分:3)

我认为我们需要更多信息才能回答您的问题。具体来说,您的视图模型是什么样的。下面是一个可以复制和粘贴的例子。

<强> Window1.xaml

<Window x:Class="WpfApplication1.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WpfApplication1"
    Title="Window1" Height="300" Width="300">
    <Window.Resources>
        <Style TargetType="{x:Type TreeViewItem}">
            <Setter Property="Background" Value="{Binding Background}"/>
        </Style>

        <HierarchicalDataTemplate x:Key="ItemTemplate" DataType="local:DataItem" ItemsSource="{Binding Path=Children}">
            <TextBlock Text="{Binding Name}" />
        </HierarchicalDataTemplate>
    </Window.Resources>

    <TreeView ItemsSource="{Binding}" ItemTemplate="{StaticResource ItemTemplate}"/>
</Window>

<强> Window1.xaml.cs

using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Windows;
using System.Windows.Media;

namespace WpfApplication1
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();

            var dis = new ObservableCollection<DataItem>();
            var di = new DataItem() { Name = "Top", Background = Brushes.Red };
            di.Children.Add(new DataItem() { Name = "Second", Background = Brushes.Blue });

            dis.Add(di);
            DataContext = dis;
        }
    }

    public class DataItem
    {
        public DataItem()
        {
            Children = new ObservableCollection<DataItem>();
        }

        public string Name
        {
            get;
            set;
        }

        public ICollection<DataItem> Children
        {
            get;
            set;
        }

        public Brush Background
        {
            get;
            set;
        }
    }
}

答案 1 :(得分:0)

使用视图模型,您将对ItemContainerStyle属性非常友好。您在代码中执行的操作设置了根级别的数据模板。您想要做的是为树视图中的每个项目设置样式,您可以这样做。

<TreeView ItemsSource="{Binding TopLevelAreas}"
          ItemContainerStyle="{StaticResource AreaTemplate}">
</TreeView>

享受

答案 2 :(得分:0)

你必须如下所述使用。使用BasedOn选项

<TreeView ItemsSource="{Binding TopLevelAreas}">
   <TreeView.Resources>
            <Style TargetType="{x:Type TreeViewItem}" BasedOn="{StaticResource StyleKey}"/>
   </TreeView.Resources>
</TreeView>