Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF和MVVM-有多少太多了?_C#_Wpf_Mvvm - Fatal编程技术网

C# WPF和MVVM-有多少太多了?

C# WPF和MVVM-有多少太多了?,c#,wpf,mvvm,C#,Wpf,Mvvm,所以我听说MVVM是在WPF中编码的方法。我有一些视图模型。然而,如果你看一下我目前拥有的代码片段,它与UI紧密耦合,这就是我想要分离出来的部分 我的第一个挑战是通过ViewModel绑定所有控件,而不是直接在代码隐藏中设置它 但这引出了一个问题。我想知道MVVM风格应该提供多少细节。我假设无论是否显示字段,用户交互都可以在UI代码中得到最好的处理。但若这使得它仍然紧密耦合,那个么MVVM方法可能是一个非常复杂的过程。 在下面的代码片段中,我添加了注释,以了解UI正在做什么。UI显示一个包含两个

所以我听说MVVM是在WPF中编码的方法。我有一些视图模型。然而,如果你看一下我目前拥有的代码片段,它与UI紧密耦合,这就是我想要分离出来的部分

我的第一个挑战是通过ViewModel绑定所有控件,而不是直接在代码隐藏中设置它

但这引出了一个问题。我想知道MVVM风格应该提供多少细节。我假设无论是否显示字段,用户交互都可以在UI代码中得到最好的处理。但若这使得它仍然紧密耦合,那个么MVVM方法可能是一个非常复杂的过程。 在下面的代码片段中,我添加了注释,以了解UI正在做什么。UI显示一个包含两个选项的单选按钮窗口。一旦用户选择了一个,就会显示两个组合框,隐藏/显示一些其他控件。在第一个组合框中选择一个项目将填充第二个组合框。从第二个组合中选择一个项目将产生一个显示的代码。某些控件根据所选单选按钮的选择而隐藏或显示

我很好奇如何去实现MVVM,有多少是太多了

public partial class TaskCodeWin : Window
{
    // Object to bind the combobox selections to.
    private SACodeGeneratorViewModel.ViewModelComboBox _viewModelComboBox;
    private SACodeGeneratorViewModel.ViewModelLitComboBox _viewModelLitComboBox;

    public TaskCodeWin()
    {
      // Display the window, Users need to pick one practice choice
        InitializeComponent();
    }

    private string[] _practicearea = new string[] { "", "" };
    private void lblPracticeArea_Click(object sender, RoutedEventArgs e)
    {
        //Set the practice area and then ...
        if (!lblPracticeArea.IsChecked.Value)
        {
            _practicearea[0] = "STD1";
            _practicearea[1] = "STD2";
        }
        else
        {
            _practicearea[0] = "MA2";
            _practicearea[1] = "";
        }

        //...set the data on appropriate comboBoxes
        SetInitializationByPractice();
    }

    private void SetInitializationByPractice()
    {
        if (_practicearea[0].Equals("MA2"))
        {
            SourceMAContext();  //Use the correct VIEWMODEL context
            InitializeMAComboBoxes();  //Populate ComboBoxes using the above VIEWMODEL
            ShowHideActivityCode(Visibility.Hidden);  // Show or Hide controls as appropriate
        }
    }

    private void PopulateFirstDigitCombo()
    {
        _viewModelComboBox.LoadFirstDigit();
    }

    private string _firstDigit = String.Empty;
    private void cmbFirstDigit_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        // Users picks FirstDigit, then ...
        if (cmbFirstDigit.SelectedIndex >= 0)
        {
            _firstDigit = SetSecondDigitByPractice(); // ...populate the Second ComboBoxes using the appropriate VIEWMODEL

            displayTaskCode(); //Show the 3 digit combination code
        }

        cmbSecondDigit.SelectedIndex = -1;  

    }

    private string SetSecondDigitByPractice()
    {
        // When Users picks FirstDigit, then populate the Second ComboBoxes using the appropriate VIEWMODEL and selected FirstDigit
        if (_practicearea[0].Equals("MA2"))
        {
            return _viewModelComboBox.LoadSecondDigit(cmbFirstDigit.SelectedItem as object);
        }
        else
        {
            return _viewModelLitComboBox.LoadSecondDigit(cmbFirstDigit.SelectedItem as object);
        }
    }

    private string[] _codes;
    private string[] displayTaskCode()
    {
        _codes = new string[] {_firstDigit,_secondDigit };

        if (_firstDigit.Equals(String.Empty) || _firstDigit.Equals("-"))
        {
            _codes[0] = "-";
        }
        if (_secondDigit.Equals(String.Empty) || _secondDigit.Equals("-"))
        {
            _codes[1] = "-";
        }
        else
        {
            _codes[0] = "";
        }

        return _codes;
    }


    #region Properties

    private string[] practiceArea
    {
        get
        {
            return _practicearea;
        }
    }

    private string[] displayCode
    {
        get
        {
            return _codes;
        }
    }

    #endregion

}

MVVM的黄金法则是视图模型不能处理与UI相关的内容

因此,以下是开始使用MVVM模式的两个建议:

  • 将UI控件(视图、用户控件等)和ViewModels分离为两个不同的程序集(包含UI内容的程序集引用包含ViewModels的程序集)。这将创建一个强大的分离,防止在ViewModels中对UI元素进行任何不必要的引用
  • 必要时编写一些代码,以处理纯UI内容,如显示弹出窗口、管理焦点、拖放等
因此,对于您的代码:

  • 基本上删除除构造函数之外的所有内容。添加一些东西来实例化ViewModel(很可能是构造函数中的
    this.DataContext=newyourViewModel();
  • 使用并执行ViewModel中的关联逻辑,而不是事件处理程序
  • 要有条件地显示/隐藏UI元素,请使用绑定转换器(类似于)将元素的
    Visibility
    属性绑定到ViewModel的
    public bool
    属性
  • 从ViewModel中公开
    ObservableCollections
    ,并使用绑定来填充组合框
  • 等等

    • MVVM的金科玉律是视图模型不能处理与UI相关的内容

      因此,以下是开始使用MVVM模式的两个建议:

      • 将UI控件(视图、用户控件等)和ViewModels分离为两个不同的程序集(包含UI内容的程序集引用包含ViewModels的程序集)。这将创建一个强大的分离,防止在ViewModels中对UI元素进行任何不必要的引用
      • 必要时编写一些代码,以处理纯UI内容,如显示弹出窗口、管理焦点、拖放等
      因此,对于您的代码:

      • 基本上删除除构造函数之外的所有内容。添加一些东西来实例化ViewModel(很可能是构造函数中的
        this.DataContext=newyourViewModel();
      • 使用并执行ViewModel中的关联逻辑,而不是事件处理程序
      • 要有条件地显示/隐藏UI元素,请使用绑定转换器(类似于)将元素的
        Visibility
        属性绑定到ViewModel的
        public bool
        属性
      • 从ViewModel中公开
        ObservableCollections
        ,并使用绑定来填充组合框
      • 等等

        • MVVM的金科玉律是视图模型不能处理与UI相关的内容

          因此,以下是开始使用MVVM模式的两个建议:

          • 将UI控件(视图、用户控件等)和ViewModels分离为两个不同的程序集(包含UI内容的程序集引用包含ViewModels的程序集)。这将创建一个强大的分离,防止在ViewModels中对UI元素进行任何不必要的引用
          • 必要时编写一些代码,以处理纯UI内容,如显示弹出窗口、管理焦点、拖放等
          因此,对于您的代码:

          • 基本上删除除构造函数之外的所有内容。添加一些东西来实例化ViewModel(很可能是构造函数中的
            this.DataContext=newyourViewModel();
          • 使用并执行ViewModel中的关联逻辑,而不是事件处理程序
          • 要有条件地显示/隐藏UI元素,请使用绑定转换器(类似于)将元素的
            Visibility
            属性绑定到ViewModel的
            public bool
            属性
          • 从ViewModel中公开
            ObservableCollections
            ,并使用绑定来填充组合框
          • 等等

            • MVVM的金科玉律是视图模型不能处理与UI相关的内容

              因此,以下是开始使用MVVM模式的两个建议:

              • 将UI控件(视图、用户控件等)和ViewModels分离为两个不同的程序集(包含UI内容的程序集引用包含ViewModels的程序集)。这将创建一个强大的分离,防止在ViewModels中对UI元素进行任何不必要的引用
              • 必要时编写一些代码,以处理纯UI内容,如显示弹出窗口、管理焦点、拖放等
              因此,对于您的代码:

              • 基本上删除除构造函数之外的所有内容。添加一些东西来实例化您的Vi