gpt4 book ai didi

c# - WPF 和 MVVM - 太多了?

转载 作者:行者123 更新时间:2023-12-03 10:58:53 30 4
gpt4 key购买 nike

所以我听说 MVVM 是在 WPF 中编码的方式。我有某种 ViewModel 到位。但是,如果您查看我目前拥有的代码片段,它与 UI 紧密耦合,这是我想要分离出来的部分。

我的第一个挑战是通过 ViewModel 绑定(bind)所有控件,而不是直接在后面的代码中设置它。

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

我很好奇如何实现 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 的黄金法则是 ViewModel 不能处理 UI 相关的东西 .

所以这里有两个开始使用 MVVM 模式的建议:

  • 将您的 UI 控件( View 、用户控件...等)和您的 ViewModel 分离为 两个不同的组件 (包含 UI 内容的那个引用包含 ViewModel 的那个)。这创建了一个强大的分离,可以防止在您的 ViewModel 中对 UI 元素进行任何不必要的引用。
  • 必要时在后面写一些代码 , 处理纯 UI 的东西,例如显示弹出窗口、管理焦点、拖放...等。

  • 所以用你的代码:
  • 基本上删除除构造函数之外的所有内容。添加一些东西来实例化您的 ViewModel(很可能是 this.DataContext = new YourViewModel(); 在构造函数中)。
  • 使用 Commanding 而不是事件处理程序,并在 ViewModel
  • 中执行相关逻辑
  • 要有条件地显示/隐藏 UI 元素,请绑定(bind) Visibility将元素的属性设置为 public bool ViewModel 的属性,使用绑定(bind)转换器(类似于 http://www.codeproject.com/Tips/285358/All-purpose-Boolean-to-Visibility-Converter )。
  • 曝光 ObservableCollections从 ViewModel 并使用 绑定(bind) 填充您的组合框
  • 关于c# - WPF 和 MVVM - 太多了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26912716/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com