在ViewModel中获取TreeView SelectedItem

瓦迪姆

我正在尝试在ViewModel中获取选定的TreeView节点

内部Xaml

<Grid>
        <TreeView ItemsSource="{Binding TreeViewModel.TreeData}">
            <TreeView.Resources>
                <HierarchicalDataTemplate ItemsSource="{Binding  GroupTables}" DataType="{x:Type tbl:StaticTablesGroup}">
                    <Label Content="{Binding Name}"/>

                </HierarchicalDataTemplate>

                <DataTemplate DataType="{x:Type tbl:GroupTable}">
                    <Label Content="{Binding Name}"/>
                </DataTemplate>
            </TreeView.Resources>

            <TreeView.ItemContainerStyle>
                <Style TargetType="TreeViewItem">
                    <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
                    <Style.Triggers>
                        <Trigger Property="IsSelected" Value="True">
                            <Setter Property="FontWeight" Value="Bold" />
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </TreeView.ItemContainerStyle>
        </TreeView>        
    </Grid>

内部VieModel

public class TreeTablesViewModel : ViewModelBase
    {
        private TablesXML _tables;
        public TreeTablesViewModel()
        {

            _tables = Deserialize.GuymasterXml();
        }

        public List<StaticTablesGroup> TreeData
        {
            get
            {
                return _tables.StaticTablesGroups;
            }

            set
            {
                _tables.StaticTablesGroups = value;
                OnPropertyChanged("TreeData");
            }
        }       
    }

最后是数据类

[XmlRoot("Tables")]
    public class TablesXML
    {
        public TablesXML()
        {
            StaticTablesGroups = new List<StaticTablesGroup>();
        }


        [XmlArray("StaticGroups")]
        [XmlArrayItem("StaticGroup", typeof(StaticTablesGroup))]
        public List<StaticTablesGroup> StaticTablesGroups { get; set; }

    }

    public class StaticTablesGroup
    {
        public StaticTablesGroup()
        {
            GroupTables = new List<GroupTable>();
        }

        [XmlAttribute("Name")]
        public string Name { get; set; }

        //[XmlArray("StaticGroup")]
        [XmlElement("Table", typeof(GroupTable))]
        public List<GroupTable> GroupTables { get; set; }


    }


    public class GroupTable
    {

        [XmlElement("TableName")]
        public string Name { get; set; }
        [XmlElement("TableTag")]
        public string Tag { get; set; }

        private bool _isSelected;
        public bool IsSelected
        {
            get { return _isSelected; }
            set
            {
                if (_isSelected != value)
                {
                    _isSelected = value;

                }
            }
        }
    }

选择Treeview节点后,将在GroupTable或StaticTablesGroup内部引发IsSelected。如何获取TreeTablesViewModel中的选定节点?

谢谢

布鲁诺

您不应尝试在视图模型内操作视图对象(TreeView,TreeViewItem,TreeNode等)。您查看模型必须仅操作业务/ poco对象。

如果要检索与所选可视对象(TreeViewItem或节点)相对应的基础业务对象,则可以使用以下行为:

public class TreeviewSelectedItemTracker
{
    public static TreeTablesViewModel GetSelectedItemHolder(DependencyObject obj)
    {
        return (TreeTablesViewModel)obj.GetValue(SelectedItemHolderProperty);
    }

    public static void SetSelectedItemHolder(DependencyObject obj, TreeTablesViewModel value)
    {
        obj.SetValue(SelectedItemHolderProperty, value);
    }

    public static readonly DependencyProperty SelectedItemHolderProperty =
        DependencyProperty.RegisterAttached("SelectedItemHolder", typeof(TreeTablesViewModel), typeof(TreeviewSelectedItemTracker), new PropertyMetadata(null, OnSelectedChanged));

    private static void OnSelectedChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        TreeView tv = (TreeView)d;
        tv.Loaded += Tv_Loaded;
    }

    private static void Tv_Loaded(object sender, RoutedEventArgs e)
    {
        TreeView tv = (TreeView)sender;
        tv.Loaded -= Tv_Loaded;
        tv.Unloaded += Tv_Unloaded;
        tv.SelectedItemChanged += Tv_SelectedItemChanged;
    }

    private static void Tv_Unloaded(object sender, RoutedEventArgs e)
    {
        TreeView tv = (TreeView)sender;

        tv.Unloaded -= Tv_Unloaded;
        tv.SelectedItemChanged -= Tv_SelectedItemChanged;
    }

    private static void Tv_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
    {
        TreeView tv = (TreeView)sender;

        var cotr = GetSelectedItemHolder(tv);

        cotr.SelectedItem = tv.SelectedItem;

    }
}

TreeView.SelectedItem直接返回与选择相关的业务对象TreeviewItem

在xaml中,使用附加属性将绑定SelectedItemHolder到您的视图模型

<TreeView ItemsSource="{Binding TreeViewModel.TreeData}" local:TreeviewSelectedItemTracker.SelectedItemHolder="{Binding}"/>

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

带有 CollectionViewSource 的 WPF ListView 未在 ViewModel 中获取 SelectedItem

数据绑定到WPF Treeview中的SelectedItem

ItemsSource到TreeView的SelectedItem属性

在DataGridViewComboBoxCell中设置SelectedItem

ListView中的SelectedItem消失

在 ComboBox 中设置 SelectedItem

ComboBox 中的 SelectedItem 绑定

使用mvvm在viewmodel中刷新后如何从listview获取最后一个SelectedItem索引?

使用绑定到 XDocument 的 DataContext 在 WPF TreeView 中设置 selectedItem

在Swift中更改UITabBar selectedItem

覆盖ListBox中的SelectedItem背景

MultiColumnComboBox中的SelectedItem为空

UWP ListView将SelectedItem绑定到viewmodel中的属性

将ListView的SelectedItem绑定到ViewModel

Xamarin列表视图SelectedItem ViewModel绑定

无法通过ViewModel在ComboBox上设置SelectedItem

使用来自另一个 ViewModel 的 treeview 的 selectedItem

如何获取Gridview的SelectedItem的子网格?

如何获取多个数据网格的SelectedItem?

使用WPF中的SelectedItem从包含TextBlocks的ListBox中获取值

组合框SelectedItem在WPF中未更新

在WPF的ListView中,SelectedItem不绑定

根据 ListBox 中的 SelectedItem 更改 Dictionary 的值

将comobox中的SelectedItem与当前ItemSource绑定?

更改WPF ListBox中SelectedItem的背景

从RowDetailsTemplate中的DataGrid无法访问SelectedItem

绑定SelectedItem以更正WPF中的DataContext

使用MVVM从ObservableCollection中删除selectedItem

如何更改SelectedItem的颜色(在ListBox中)?