Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.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# 如何访问视图控件';ViewModel中有什么?_C#_Design Patterns_Mvvm_View_Viewmodel - Fatal编程技术网

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}"/>