WPF MVVM Могу ли я использовать модель из вида - PullRequest
1 голос
/ 11 октября 2019

Я все еще новичок в 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 iесть сетка данных

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

Это нормально? Или как мне это сделать, не нарушая шаблон MVVM?

Ответы [ 3 ]

0 голосов
/ 11 октября 2019

Обработчик события OHLCChart_Click в представлении должен быть заменен свойством ICommand модели представления, к которой вы привязываете:

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

Пожалуйста, обратитесь к этому блогуопубликовать для получения дополнительной информации о том, как обрабатывать события в MVVM.

Вы также должны привязать свойство SelectedItem DataGrid к свойству источника модели представления:

<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, такие как, например, Prism и MvvmLight, которые предоставляют реализации для ICommand и другие вещи, связанные с MVVM, чтобы сделать вашу жизнь проще.

0 голосов
/ 11 октября 2019

Цель MVVM - избежать кода и отделить представление от логики. используйте команды в viewModel и привяжите представление к этим командам в представлении. Просмотреть модель доступа к модели. что-то вроде ниже, где ChartClickCommand должен быть реализован в ViewModel

<DataGrid x:Name="GridData" ItemsSource="{Binding MarketPriceGrid}">
  <DataGrid.ContextMenu>
    <ContextMenu>
      <MenuItem Header="OHLC Chart" Command={Binding ChartClickCommand}/>
     </ContextMenu>
    </DataGrid.ContextMenu>
</DataGrid>
0 голосов
/ 11 октября 2019

Посмотрите на MVVM-фреймворк. Как сказано в комментарии @Ash, вы не реализуете шаблон MVVM. Взгляните на Caliburn Micro, MVVM Light. Также взгляните на эту ветку, я более чем уверен, что она вам очень поможет.

Как установить ViewModel для окна в XAML, используя свойство DataContext?

...