以编程方式选择并突出显示datagriditem MVVM

时间:2014-04-29 07:49:44

标签: wpf mvvm datagrid highlight selecteditem

当我尝试以编程方式在Item中选择一些DataGrid时遇到问题。不使用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

Good result

选择

Item并正确突出显示。

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

SelectedItem = (GridItem)selItem; // Bad

Bad result

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

2 个答案:

答案 0 :(得分:3)

您需要从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));
    }
}

答案 1 :(得分:0)

我做了很多,DataGrid到ViewModel,我从来没有做过

SelectedItem =(GridItem)selItem;

即施放物品。

由于您在DataGrid XAML上有SelectedItem,它也知道您绑定的类型。

但是,我通常也会在gridview上使用ItemSource。

e.g。 ItemSource =“{绑定GridItem的集合}”

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

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

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

干杯

相关问题