所以我听说MVVM是在WPF中编码的方式。我有一些ViewModel。但是,如果你查看我目前拥有的代码片段,它与UI紧密结合,这是我想要分离的部分。
我的第一个挑战是通过ViewModel绑定所有控件,而不是直接在后面的代码中设置它。
但这引出了一个问题。我想知道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
}
答案 0 :(得分:3)
MVVM的黄金法则是 ViewModel不得处理与UI相关的东西。
所以这里有两个建议开始使用MVVM模式:
所以使用你的代码:
this.DataContext = new YourViewModel();
)。Visibility
属性绑定到ViewModel的public bool
属性。ObservableCollections
并使用绑定填充您的组合框