当我尝试以编程方式在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
选择
Item
并正确突出显示。
但是,当我尝试通过Item
属性选择并突出显示Model
时,Item
未突出显示!
SelectedItem = (GridItem)selItem; // Bad
是什么原因?有什么想法吗?
答案 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是你需要看的地方。
如果你愿意,我可以给你一个例子。
干杯