我正在编写旨在解决标准问题的WPF应用程序。我是WPF和MVVM模式的新手,所以在网上阅读了大量不同的MVVM方法后,我的脑子里有点乱。我想知道DataGrid的itemsource刷新操作的简单操作对于MVVM来说是“惯用的”。
假设我有一个数据网格和一个组合框。组合包含所有教练的列表。数据网格显示所有由选定教练训练的运动员,因此组合就像数据网格中数据的过滤器一样:
<ComboBox ItemsSource="{Binding ListCoach}" DisplayMemberPath="last_name" SelectedValue=
"{Binding SelectedCoach}" SelectedValuePath="Id"/>
<DataGrid ItemsSource="{Binding Path=ListSportsman}" ..... </DataGrid>
我的ViewModel类更改了SelectedCoach属性的 setter 中的DataGrid内容(此属性是Combobox值的目标):
private int _selectedCoach;
public int SelectedCoach
{
get { return _selectedCoach; }
set
{
_selectedCoach = value;
ListSportsman = new ObservableCollection<sportsmanset>(_serviceAgent.ListSportsmanOfCoach(value));
NotifyPropertyChanged(vm => vm.SelectedCoach);
}
}
这些代码闻不到吗?或者,在SelectedCoach属性中订阅更改并在单独的函数中设置ListSportsman更合适? (顺便说一句,如何手动订阅NotifyPropertyChanged事件?)
答案 0 :(得分:2)
根据定义没有错,但有一点需要考虑:
一般来说,开发人员希望定位器和吸气器快速。因此,如果要添加需要花费大量时间的逻辑,则可能需要异步执行该逻辑或使用Set方法替换该属性,因此很明显存在涉及的处理。
部分处理可能是设置View可以绑定的属性。
答案 1 :(得分:0)
不,这段代码没有'闻到'!
视图模型与它“后退”的视图密切相关。在您描述的视图中,这两个属性非常紧密耦合,因此它们在视图模型中紧密耦合是有意义的。
另外,只要问问自己,有什么好处可以让逻辑填充数据网格,通过事件处理松散耦合?这可以让您更容易地执行此逻辑作为其他事件的结果,或者可能分成两个类,以便在代码中的其他位置重用。这些情况中是否有可能出现?如果没有,让代码变得更加复杂,本身就是代码味道!
顺便说一下,如果你想手动处理这个,你需要在类PropertyChanged
事件中添加一个事件处理程序。
答案 2 :(得分:0)
我的回答是“不,不行”。对于简单的应用程序/原型,它很好,但是对于更高级的场景或养成良好的习惯/设置示例 - 它不是。
该怎么做?没有“一个尺寸适合所有答案”但我建议根据我的经验: