我还是 MVVM/WPF 的新手,在我的控制下,我创建了一个网格,当用户点击一行时,我希望它做一些事情。目前,我在我的代码中在 View 上执行了一些代码。这个可以吗?因为 View 需要从模型中访问数据,或者我怎样才能完全分离 View 和模型?
目前,我有这个...
// our View Window
public partial class MarketPriceView : UserControl
{
public MarketPriceView()
{
InitializeComponent();
}
private void OHLCChart_Click(object sender, RoutedEventArgs e)
{
// MarketPriceGrid is our model
var cell = GridData.SelectedItem as MarketPriceGrid;
string prod = cell.ProdCode;
// do something with prod ...
}
}
我的 XAML 我有一个数据网格
<DataGrid x:Name="GridData" ItemsSource="{Binding MarketPriceGrid}">
<DataGrid.ContextMenu>
<ContextMenu>
<MenuItem Header="OHLC Chart" Click="OHLCChart_Click"/>
</ContextMenu>
</DataGrid.ContextMenu>
...
</DataGrid>
这个可以吗?或者我应该如何在不破坏 MVVM 模式的情况下进行操作?
最佳答案
OHLCChart_Click
View 中的事件处理程序应替换为 ICommand
您绑定(bind)到的 View 模型的属性:
<MenuItem Header="OHLC Chart" Command="{Binding ChartCommand"}/>
请引用this有关如何在 MVVM 中处理事件的更多信息的博客文章。
您还应该绑定(bind)
SelectedItem
DataGrid
的属性(property)到 View 模型的源属性:<DataGrid x:Name="GridData" ItemsSource="{Binding MarketPriceGrid}"
SelectedItem="{Binding TheSelectedItem}">
然后,您将可以直接访问
Execute
中当前选定的项目。 View 模型中的命令方法:_clickCommand = new DelegateCommand<object>(
(s) => { /* do something with this.TheSelectedItem */ }, //Execute
(s) => true //CanExecute
);
这样,您将应用程序逻辑从 View 移动到它所属的 View 模型,并且可以在不存在 View 的情况下单独测试和发展。
请注意,那里有 MVVM 框架,例如
Prism
和 MvvmLight
,为 ICommand
提供实现和其他 MVVM 相关的东西,让你的生活更轻松。
关于c# - WPF MVVM 我可以从 View 中使用模型吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58338252/