【问题标题】:How to bind the property to the selected node in the Treeview in WPF如何将属性绑定到 WPF 中 Treeview 中的选定节点
【发布时间】:2012-01-10 08:39:55
【问题描述】:

如何将自定义属性绑定到 MVVM 中选定节点的 IsSelected 属性, 我已在运行时将节点加载到树视图中。我正在使用 MVVM

【问题讨论】:

    标签: c# wpf mvvm


    【解决方案1】:

    这是一个小例子:

    public abstract class ViewModel : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
    
        protected void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }
    
    public class MyViewModel : ViewModel
    {
        public ObservableCollection<Item> Items
        {
            get
            {
                return new ObservableCollection<Item>()
                {
                    new Item() {DisplayValue = "Item1", IsSelected = false, Sample = "Sample: I am Item1"},
                    new Item() {DisplayValue = "Item2", IsSelected = true, Sample = "Sample: I am Item2"},
                    new Item() {DisplayValue = "Item3", IsSelected = false, Sample = "Sample: I am Item3"}
                };
            }
        }
    }
    
    public class Item : ViewModel
    {
        public string DisplayValue { get; set; }
    
        private bool _isSelected = false;
    
        public bool IsSelected
        {
            get
            {
                return _isSelected;
            }
            set
            {
                _isSelected = value;
                OnPropertyChanged("IsSelected");
            }
        }
    
        private string _sample;
    
        public string Sample
        {
            get
            {
                return _sample;
            }
            set
            {
                _sample = value;
                OnPropertyChanged("Sample");
            }
        }
    }
    

    XAML:

    <Window x:Class="WpfApplication93.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:local="clr-namespace:WpfApplication93"
            Title="MainWindow" Height="350" Width="525">
      <Grid>
        <Grid.DataContext>
          <local:MyViewModel></local:MyViewModel>
        </Grid.DataContext>
    
        <StackPanel>
          <TreeView x:Name="myTreeView" ItemsSource="{Binding Items}">
            <TreeView.ItemContainerStyle>
              <Style TargetType="{x:Type TreeViewItem}">
                <Setter Property="IsSelected" Value="{Binding IsSelected}"></Setter>
                <Setter Property="Template">
                  <Setter.Value>
                    <ControlTemplate TargetType="TreeViewItem">
                      <TextBlock Text="{Binding DisplayValue}"></TextBlock>
                    </ControlTemplate>
                  </Setter.Value>
                </Setter>
    
                <Style.Triggers>
                  <Trigger Property="IsSelected" Value="True">
                    <!-- if you want to customize the appearance of a selected element do it here -->
                    <Setter Property="FontWeight" Value="Bold" />
                  </Trigger>
                </Style.Triggers>
              </Style>
            </TreeView.ItemContainerStyle>
          </TreeView>
    
          <Label Content="{Binding ElementName=myTreeView, Path=SelectedItem.Sample}"></Label>
        </StackPanel>
      </Grid>
    </Window>
    

    【讨论】:

    • &lt;TreeView.ItemContainerStyle&gt; &lt;Style TargetType="{x:Type TreeViewItem}"&gt; &lt;Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" /&gt; &lt;/Style&gt; &lt;/TreeView.ItemContainerStyle&gt; 我使用了上面的代码,并在 IsSelected 设置属性上放置了断点。它不工作。
    • 请查看输出窗口。您是否发现任何绑定错误?吸气剂是否工作,即。当你将一个 Treeviewitem 设置为 IsSelected=true 时,它​​是否在视图中被选中?
    • 我想做一些操作,当我在树视图中选择一个节点时
    • 您的示例代码适用于粗体选择的项目。但它不适用于 selectedItemChanged
    • Tanya,我粘贴了一个 MVVM 示例。不需要 SelectedItemChanged 事件,因为如果通过“IsSelected”属性选择了项目,则会收到通知。这也是您可以执行操作以对所选元素执行其他操作的点。
    猜你喜欢
    • 2010-09-19
    • 2013-02-22
    • 1970-01-01
    • 2011-04-29
    • 1970-01-01
    • 2017-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多