Передача метода ViewModel против передачи связанных переменных - PullRequest
0 голосов
/ 15 марта 2019

У меня ComboBox привязан к ViewModel string Quality_SelectedItem.

И у меня есть метод с именем Quality, который внутри получает доступ к значению SelectedItem в операторе if.

У меня есть два способа получить доступ к значению: передать ViewModel через метод или передать string Quality_SelectedItem.

Каким образом я должен его использовать и какой работает быстрее?


XAML

<ComboBox x:Name="cboQuality" 
          ItemsSource="{Binding Quality_Items}"
          SelectedItem="{Binding Quality_SelectedItem, Mode=TwoWay}"
          HorizontalAlignment="Left" 
          Margin="0,2,0,0" 
          VerticalAlignment="Top" 
          Width="105" 
          Height="22"/>

Класс ViewModel

public class ViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged = delegate { };
    private void OnPropertyChanged(string prop)
    {
        PropertyChangedEventHandler handler = PropertyChanged;

        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(prop));
        }
    }

    // Quality Selected Item
    private string _Quality_SelectedItem { get; set; }
    public string Quality_SelectedItem
    {
        get { return _Quality_SelectedItem; }
        set
        {
            if (_Quality_SelectedItem == value)
            {
                return;
            }

            _Quality_SelectedItem = value;
            OnPropertyChanged("Quality_SelectedItem");
        }
    }

    ...

Пример 1 - Передача ViewModel

В методе качества я получаю доступ к vm.Quality_SelectedItem непосредственно из оператора if.

public ViewModel vm = new ViewModel();

// MainWindow
public MainWindow() 
{
    InitializeComponent();
    DataContext = vm;

    // Quality Method
    Quality(vm); // <---
}


// Quality Method
public static void Quality(ViewModel vm) 
{
    if (vm.Quality_SelectedItem == "High") 
    {
        // do something
    }
    else if (vm.Quality_SelectedItem == "Low") 
    {
        // do something
    }
}

Пример 2. Передача строки SelectedItem

Я передаю vm.Quality_SelectedItem через Метод Качества и даю ему string имя quality.

public ViewModel vm = new ViewModel();

// MainWindow
public MainWindow() 
{
    InitializeComponent();
    DataContext = vm;

    // Quality Method
    Quality(vm.Quality_SelectedItem); // <---
}


// Quality Method
public static void Quality(string quality) 
{
    if (quality == "High") 
    {
        // do something
    }
    else if (quality == "Low") 
    {
        // do something
    }
}

Ответы [ 2 ]

1 голос
/ 15 марта 2019

Как правило, вы должны сделать свой код максимально простым. Помните принцип KISS. Это также хорошо работает с SOLID («простой» является хорошим способом достижения единой ответственности и разделения интерфейса).

Избегайте попадания в один объект, чтобы получить другой.

Если вам нужно только значение string в методе, только передайте это значение string. Не заставляйте ваш метод копаться в иерархиях объектов и зависимостях, чтобы получить это значение.

Если метод должен изменить a string значение свойства, затем передать объект, где нужно изменить свойство.

С точки зрения производительности, вы не заметите никаких изменений. Доступ к объекту по ссылке - очень дешевая операция. (Если вы не реализуете циклы с миллиардами итераций.)

С точки зрения дизайна, простота делает ваш код SOLID и позволяет легко использовать повторно.

0 голосов
/ 15 марта 2019

Это зависит от того, что //do something.

  • Если вам нужно обработать / взаимодействовать с вашим viewmodel -объектом, тогда передайте viewmodel как параметр
  • в противном случае используйте строку для меньшего количества зависимостей и возможности общего использования.
  • Если у вас ваша модель представления как синглтон, то не имеет значения, по какому пути вы пойдете.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...