方法传递ViewModel与传递绑定变量

时间:2019-03-15 12:13:51

标签: c# wpf xaml mvvm

我有一个ComboBox绑定到ViewModel string Quality_SelectedItem

我有一个名为Quality的方法,该方法在内部if语句中访问SelectedItem的值。

我有两种访问值的方法,一种是通过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 个答案:

答案 0 :(得分:1)

作为一般规则,您应该使代码尽可能简单。记住KISS原则。这在SOLID中也能很好地发挥作用(“简单”是实现单一职责和接口隔离的好方法。

避免伸手去拿另一个物体。

如果方法中仅需要一个string值,则仅传递该string值。不要强迫您的方法深入研究对象层次结构和依赖关系以获得该值。

如果该方法需要 modify 一个string属性值,则将该对象传递到修改属性的位置。

从性能的角度来看,您不会注意到任何更改。通过引用访问对象是非常便宜的操作。 (除非您要实现数十亿次迭代的循环。)

从设计的角度来看,使事情保持简单可使您的代码成为SOLID,并轻松地允许重复使用。

答案 1 :(得分:0)

这取决于//do something

  • 如果您必须处理/交互viewmodel对象,请通过 viewmodel作为参数
  • 否则,请使用字符串以减少依赖性,并减少常见使用的可能性。
  • 如果您的视图模型为单身人士,那么走哪条路都没关系。