我已经将DataGrid绑定到ObservableCollection<>在其ViewModel中:
<DataGrid ItemsSource="{Binding Path=Data}" SelectedItem="{Binding Path=CurrentItem}" />
视图模型:
public ObservableCollection<TestModel> Data { get; set; }
private TestModel _currentItem;
public TestModel CurrentItem
{
get { return _currentItem; }
set
{
_currentItem = value;
RaisePropertyChanged("CurrentItem");
}
}
现在我想要的是,DataGrid将在Form-startup上预先选择第一行。所以我将以下内容放在构造函数中的测试代码中:
Data = new ObservableCollection<TestModel>
{
new TestModel() { Property1 = Guid.NewGuid().ToString() },
new TestModel() { Property1 = Guid.NewGuid().ToString() },
new TestModel() { Property1 = Guid.NewGuid().ToString() }
};
CurrentItem = Data[0];
显示数据但网格未选择第一行。即使我将绑定设置为TwoWay,也无法正常工作。
如果我删除XAML中的SelectedItem绑定并在代码隐藏中添加以下内容,则效果很好:
private void Window_Loaded(object sender, RoutedEventArgs e)
{
var m = this.DataContext as MainViewModel;
grid.SelectedItem = m.CurrentItem;
}
答案 0 :(得分:1)
正在发生的事情是,在初始化窗口之前,您的VM被分配到数据上下文,因此永远不会收到CurrentItem已更改的消息,因为它在加载之前已更改。
我所做的是将视图模型传递给View的构造函数,并在调用InitializeComponent()函数后设置它。因为我使用的是Prism,我使用的是控制反转(IOC),Prism知道将我的VM输入到构造函数中。如果您自己实例化视图和查看模型,则可以传入视图模型。我遇到了同样的问题,这很有效。
public MyView(IMyVM viewModel)
{
InitializeComponent();
this.DataContext = viewModel;
}
顺便说一句,在使用MVVM时,我认为没有理由不将ViewModel传递给View,因为视图依赖于它。我知道有些人会有不一样的感觉,但这或者你要在Window_Loaded事件中对datacontext进行某种类型的刷新。