C# 如何访问视图控件';ViewModel中有什么?
我遇到了这样的情况,我需要从C# 如何访问视图控件';ViewModel中有什么?,c#,design-patterns,mvvm,view,viewmodel,C#,Design Patterns,Mvvm,View,Viewmodel,我遇到了这样的情况,我需要从ViewModel访问视图中的控件。以编写一种方法,将组合框中的选定项添加到列表中 我的问题是如何从视图模型访问视图控件?我是否应该遵循某种设计模式来实现这一点 下面的方法是在视图的代码隐藏中编码的,我知道如果遵循MVVM模式,这是一种不好的做法,因为涉及到紧密耦合。这就是为什么我打算将此方法移动到ViewModel 该方法的目的是从两个组合框中获取当前选定的项目,并将其添加到键/值列表: ViewModel的简化实现如下所示,以供参考,在注释中显示了我如何平移以实
ViewModel
访问视图中的控件。以编写一种方法,将组合框中的选定项添加到列表中
我的问题是如何从视图模型
访问视图
控件?我是否应该遵循某种设计模式来实现这一点
下面的方法是在视图的
代码隐藏中编码的,我知道如果遵循MVVM模式,这是一种不好的做法,因为涉及到紧密耦合。这就是为什么我打算将此方法移动到ViewModel
该方法的目的是从两个组合框
中获取当前选定的项目,并将其添加到键/值列表
:
ViewModel
的简化实现如下所示,以供参考,在注释中显示了我如何平移以实现AddGradeSubjectChoiceToList()
方法:
namespace LC_Points.ViewModel
{
公共类MainViewModel:ViewModelBase
{
私人计分模型(ScoreModel);;
///
///初始化MainViewModel类的新实例。
///
公共主视图模型(ScoreModel GradeModel)
{
_分数模型=等级模型;
//调用方法初始化列表数据
GetSubjectTypes();
GetOrdinaryGradePairs();
}
公共列表主题{get;set;}
公共列表OrdinalGradePointKV{get;set;}
//普通切换按钮
私人布尔(bool)isordinarytoggle ;;
公共图书馆同心协力
{
收到
{
返回_isOrdinaryToggled;
}
设置
{
_isOrdinaryToggled=值;
RaisePropertyChanged(“ISORDINARYTOGGED”);
}
}
//需要在此处将相同的方法从代码隐藏添加到VM
//但是不能访问视图的控件从组合框中存储主题和等级的方法
public void addgrade subjectchoicetolist()
{
}
//此中继命令绑定到视图中将使用的按钮
//调用AddGradeSubjectChoiceToList方法
RelayCommand addgrade命令;
公共RelayCommand addgrade命令
{
收到
{
if(addGradeCommand==null)
{
AddGrade命令=新的RelayCommand(()=>
{
AddGrade主题选择列表
});
}
返回addgrade命令;
}
}
公共类StringKeyValue
{
公共字符串密钥{get;set;}
公共int值{get;set;}
}
public void GetOrdinaryGradePairs()
{
List ordinaryGradePointKVTemp=new List();
ordinaryGradePointKVTemp.Add(新的StringKeyValue{Key=“A1”,Value=60});
ordinaryGradePointKVTemp.Add(新的StringKeyValue{Key=“A2”,Value=50});
ordinaryGradePointKVTemp.Add(新的StringKeyValue{Key=“B1”,Value=45});
ordinaryGradePointKVTemp.Add(新的StringKeyValue{Key=“B2”,Value=40});
ordinaryGradePointKVTemp.Add(新的StringKeyValue{Key=“B3”,Value=35});
ordinaryGradePointKVTemp.Add(新的StringKeyValue{Key=“C1”,Value=30});
ordinaryGradePointKVTemp.Add(新的StringKeyValue{Key=“C2”,Value=25});
ordinaryGradePointKVTemp.Add(新的StringKeyValue{Key=“C3”,Value=20});
OrdinaryGradePointKV=ordinaryGradePointKVTemp;
}
public void GetSubjectTypes()
{
List subjectList=新建列表();
//将主题添加到列表中
添加(新的ScoreModel{Subject=“Accounting”});
添加(新的评分模型{Subject=“农业经济学”});
添加(新的评分模型{Subject=“Agricultural Science”});
subjectList.Add(新的ScoreModel{Subject=“古希腊”});
添加(新的ScoreModel{Subject=“applicated Math”});
添加(新的ScoreModel{Subject=“阿拉伯语”});
添加(新的ScoreModel{Subject=“Art”});
添加(新的ScoreModel{Subject=“Artic&Creative Group”});
添加(新的评分模型{Subject=“Biology”});
添加(新的ScoreModel{Subject=“Business”});
主题=主题列表;
}
}
}
正如上面的评论所指出的,当遵循MVVM模式时,将视图耦合到ViewModel的解决方案是不好的做法
适当的解决方案是为组合框的SelectedItem
设置一个属性,并将视图绑定到该属性,以便所选项目可以在VM中使用
1.在视图中设置与SelectedItem的绑定:
SelectedItem="{Binding SelectedSubject,Mode=TwoWay}"
private ComboBox _selectedSubject;
public ComboBox SelectedSubject
{
get { return _selectedSubject; }
set
{
_selectedSubject = value;
RaisePropertyChanged("SelectedSubject");
}
}
2.在视图模型中创建ComboBox属性:
SelectedItem="{Binding SelectedSubject,Mode=TwoWay}"
private ComboBox _selectedSubject;
public ComboBox SelectedSubject
{
get { return _selectedSubject; }
set
{
_selectedSubject = value;
RaisePropertyChanged("SelectedSubject");
}
}
为了遵循MVVM,您应该使用泛型类型并将它们绑定到控件
以下是我的一个ViewModels中的一个示例:
private string[] _optionItems;
public string[] OptionItems
{
get
{
return _optionItems;
}
set
{
if (_optionItems == value)
return;
_optionItems = value;
OnPropertyChanged();
}
}
private string _selectedOption;
public string SelectedOption
{
get
{
return _selectedOption;
}
set
{
if (_selectedOption == value)
return;
_selectedOption = value;
OnPropertyChanged();
}
}
下面是XAML代码:
<ComboBox ItemsSource="{Binding OptionItems}" SelectedItem="{Binding SelectedOption}"/>
您可以发布相应的XAML代码吗?在问题中添加了上述XAML。您应该将每个组合框的SelectedItem
绑定到视图模型,而不是将视图模型与视图耦合。有该实现的代码示例吗^^您不会将UI发送到ViewModel。如果你想这样做,就在代码背后继续你的工作。如果您能够找到如何绑定到ItemsSource属性,则可以绑定到SelectedItem属性。同样的模式。这仍然是一个糟糕的MVVM实践,因为您仍然在引用一个特定的UI控件
<ComboBox ItemsSource="{Binding OptionItems}" SelectedItem="{Binding SelectedOption}"/>