c# - WPF MVVM 我可以从 View 中使用模型吗

标签 c# wpf mvvm data-binding

我还是 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 框架,例如 PrismMvvmLight ,为 ICommand 提供实现和其他 MVVM 相关的东西,让你的生活更轻松。

关于c# - WPF MVVM 我可以从 View 中使用模型吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58338252/

相关文章:

c# - netduino 2 上的按钮事件

c# - WPF ListBox 属性绑定(bind)不更新

c# - 触发 PropertyChanged 时 WPF 依赖属性 setter 未触发,但源值未更改

wpf - IsMouseOver 与 ListViewItem 的 IsSelected 重叠

c# - MVVM:如何避免将 DataContext 添加到 Xaml 以获得混合支持

c# - 从 LINQ 查询结果填充 Observable 集合

c# - DataContext如何在包含View的View中继承?

c# - 使用 xslt 从 rss 文件创建 html 列表

c# - InstallAllUsers 选项如何工作?

c# - 如何检查一个字符串是否是一个(非常大的)数字?