【问题标题】:WPF MVVM Can i use model from viewWPF MVVM 我可以从视图中使用模型吗
【发布时间】:2020-02-08 19:18:13
【问题描述】:

我还是 MVVM/WPF 的新手,在我的控制下,我创建了一个网格,当用户点击一行时,我希望它做一些事情。目前,我在我的代码中在视图上执行了一些代码。这个可以吗?因为视图需要从模型中访问数据,或者我怎样才能完全分离视图和模型?

目前,我有这个...

// 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 模式的情况下我应该如何去做?

【问题讨论】:

  • 当您没有 ViewModel 时,它不是 MVVM 实现。你不能破坏不存在的东西

标签: c# wpf mvvm data-binding


【解决方案1】:

视图中的OHLCChart_Click 事件处理程序应替换为您绑定到的视图模型的ICommand 属性:

<MenuItem Header="OHLC Chart" Command="{Binding ChartCommand"}/>

有关如何在 MVVM 中处理事件的更多信息,请参阅 this 博客文章。

您还应该将DataGridSelectedItem 属性绑定到视图模型的源属性:

<DataGrid x:Name="GridData" ItemsSource="{Binding MarketPriceGrid}"
          SelectedItem="{Binding TheSelectedItem}">

然后,您将可以直接访问视图模型中命令的Execute 方法中的当前选定项:

_clickCommand = new DelegateCommand<object>(
        (s) => { /* do something with this.TheSelectedItem */ }, //Execute
        (s) => true //CanExecute
        );

这样,您可以将应用程序逻辑从视图移动到它所属的视图模型,并且可以在没有视图的情况下单独测试和发展。

请注意,有一些 MVVM 框架,例如 PrismMvvmLight,它们提供了 ICommand 和其他 MVVM 相关内容的实现,让您的生活更轻松。

【讨论】:

  • 谢谢!!!!这行得通,这是我使用的解决方案。非常感谢!
【解决方案2】:

MVVM 的目的是避免隐藏代码并将视图与逻辑分离。使用 viewModel 中的命令并将视图绑定到视图中的这些命令。 Viewmodel 实习生访问模型。类似于下面的 ChartClickCommand 应该在 ViewModel 中实现

<DataGrid x:Name="GridData" ItemsSource="{Binding MarketPriceGrid}">
  <DataGrid.ContextMenu>
    <ContextMenu>
      <MenuItem Header="OHLC Chart" Command={Binding ChartClickCommand}/>
     </ContextMenu>
    </DataGrid.ContextMenu>
</DataGrid>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多