【问题标题】:Programmatically select and highlight datagriditem MVVM以编程方式选择和突出显示 datagriditem MVVM
【发布时间】:2014-06-15 00:55:52
【问题描述】:

当我尝试以编程方式在 DataGrid 中选择一些 Item 时遇到问题。不使用MVVM 模式一切正常。看看 XAML:

    <DataGrid 
        Name="_dataGrid"
        AutoGenerateColumns="False"
        SelectedItem="{Binding SelectedItem, Mode=TwoWay}">
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding Name}"/>
            <DataGridTextColumn Binding="{Binding SecondName}"/>
        </DataGrid.Columns>
    </DataGrid>

后面的代码:

    public class GridItem
    {
        public String Name { get; set; }
        public String SecondName { get; set; }
    }

    public partial class Window1 : Window
    {
        public event PropertyChangedEventHandler PropertyChanged;
        protected void RaisePropertyChanged(String propertyName)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }

        private GridItem _selectedItem;
        public GridItem SelectedItem
        {
            get { return _selectedItem; }
            set
            {
                _selectedItem = value;
                RaisePropertyChanged("SelectedItem");
            }
        }

        public Window1()
        {
            InitializeComponent();
            DataContext = this;

            _dataGrid.Loaded += DataGridLoaded;
            Init1();
        }

        void DataGridLoaded(object sender, RoutedEventArgs e)
        {
            Int32 rowIndex = 2;
            var selItem = _dataGrid.Items[rowIndex];

            SelectedItem = (GridItem)selItem;     <-------- Bad
            //_dataGrid.SelectedItem = selItem;   <-------- Good
        }

        private void Init1()
        {
            var source = new List<GridItem>();
            source.Add(new GridItem
            {
                Name = "pavlik",
                SecondName = "bobr"
            });
            source.Add(new GridItem
            {
                Name = "alex",
                SecondName = "ugr"
            });
            source.Add(new GridItem
            {
                Name = "den",
                SecondName = "ivanov"
            });
            source.Add(new GridItem
            {
                Name = "dima",
                SecondName = "klim"
            });
            _dataGrid.ItemsSource = source;
        }
    }

所以,当我像这样选择Item

_dataGrid.SelectedItem = selItem; // Good

Item 被正确选择并突出显示。

但是当我尝试通过Model 属性选择并突出显示Item 时,Item 没有突出显示!

SelectedItem = (GridItem)selItem; // Bad

是什么原因?有什么想法吗?

【问题讨论】:

    标签: wpf mvvm datagrid highlight selecteditem


    【解决方案1】:

    我经常这样做,从 DataGrid 到 ViewModel,我从来不需要这样做

    SelectedItem = (GridItem)selItem;

    即施放物品。

    因为您在 DataGrid XAML 上有 SelectedItem,它也知道您要绑定的类型。

    不过,我通常也会在 gridview 上使用 ItemSource。

    例如ItemSource = "{绑定GridItem的集合}"

    所以在 ViewModel 中,我会将 Observablecollection 或 List 作为属性。

    我的 WPF 知识只有 2 周大,所以我可能完全错了,但我认为演员和 Itemsource 是你需要查看的地方。

    如果你愿意,我可以给你一个例子。

    干杯

    【讨论】:

    • 请给我代码,我不明白你的解决方案。怎么设置ItemSource没关系,我知道可以绑定到ObservableCollection。问题是 - 所选项目未突出显示。
    • _dataGrid.Items[rowIndex] 返回Object。 SelectedItem="{Binding SelectedItem, Mode=TwoWay}" - 正确绑定,我没有任何 XAML 错误。
    • updatesourcetrigger 属性表示您的SOURSE 属性何时更新,UI 元素的相应属性是否会更改。如果您不知道 - 请停止建议无用的东西。
    • 显然,代码不正确,它不能按我的意愿工作:) 但它可能是 WPF 功能... DataGridLoad 处理程序 - 仅用于模拟情况,只是为了确保所有网格都已加载。所有这一切 - 简化的例子。所以如果你有它,请给我你的工作代码样本。
    【解决方案2】:

    您需要从INotifyPropertyChanged 继承您的窗口或任何 viewmodel 类,否则它将通知客户端属性值已更改。

    你的情况可能是这样的

    public partial class Window1 : INotifyPropertyChanged
    {
        // Class code goes here;
        public event PropertyChangedEventHandler PropertyChanged;
        protected void RaisePropertyChanged(String propertyName)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
    

    【讨论】:

    • Omg...我实现了这个接口,但我没有声明它。谢谢,它现在可以工作了。
    猜你喜欢
    • 1970-01-01
    • 2018-02-14
    • 2015-12-28
    • 2018-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    相关资源
    最近更新 更多