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# 使用MVVM向WPF中的网格添加不同的用户控件_C#_Wpf_Xaml_Mvvm_User Controls - Fatal编程技术网

C# 使用MVVM向WPF中的网格添加不同的用户控件

C# 使用MVVM向WPF中的网格添加不同的用户控件,c#,wpf,xaml,mvvm,user-controls,C#,Wpf,Xaml,Mvvm,User Controls,到目前为止,我有五个不同的用户控件,将来这个数量还会增加。我想使用MVVM模式将它们添加到网格中 我有一个类装置,可以作为用户控件的视图模型 public class Apparatus { private string _appratusName; private string _imageSource; private string _experiments; private GridProperties gridProps; public App

到目前为止,我有五个不同的用户控件,将来这个数量还会增加。我想使用MVVM模式将它们添加到网格中

我有一个类装置,可以作为用户控件的视图模型

public class Apparatus 
{
    private string _appratusName;
    private string _imageSource;
    private string _experiments;
    private GridProperties gridProps;

    public Apparatus()
    {
        _appratusName = "";
        _imageSource = "";
        Experiments = "";
    }

    public Apparatus(string name, string imgSource, string exp)
    {
        _appratusName = name;
        _imageSource = imgSource;
        _experiments = exp;

    }}
GridProperties是另一个用于包含UserControls在网格中的位置的类

public class GridProperties
{
    public int Row;

    public int Column;

    public int ColumnSpan;

    public int RowSpan;

    public GridProperties(int row, int col, int rowSpan, int columnSpan)
    {
        this.Row = row;
        this.Column = col;
        this.RowSpan = rowSpan;
        this.ColumnSpan = columnSpan;
    }
类中的每个字段都有公共属性。

还有一个实验GridViewModel类似于

    public class ExperimentGridViewModel : ViewModelBaseClass
{
    private int _apparatusCount;
    private string _workingExperiment;
    private int _gridRowCount;
    private int _gridColumnCount;
    private ExperimentWindowViewModel _windowModel;

    private ObservableCollection<Apparatus> _apparatusAppplied;}
公共类实验GridViewModel:ViewModelBaseClass
{
私人int_仪器计数;
私有字符串\u工作实验;
私有int_gridRowCount;
私有int_gridColumnCount;
私有WindowViewModel\u windowModel;
专用可观测采集设备应用;}
我想添加用户控件,基本上是使用MVVM的滴定管、pippete等设备

我查看了一些答案,发现可以使用数据模板和ItemsControl来完成,但问题是我只有一种数据类型,即设备对于我的所有用户控件,我是否需要为每个用户控件创建不同的类,或者我是否可以做其他事情

现在我能做的就是这样的事情

<Grid.Resources>
        <DataTemplate DataType="{x:Type model:Apparatus }">
            <apparatuses:Burette></apparatuses:Burette>
        </DataTemplate>
    </Grid.Resources>
    <ItemsControl ItemsSource="{Binding AppliedApparatus}" >

    </ItemsControl>

这会将滴定管添加到网格中,我无法添加任何其他内容,因为所有仪器都属于Appatatus类型


另外,请任何人告诉我如何将viewModel中的GridProperties绑定到UserControls的附加网格属性

您可以创建不同的视图模型类(都是从设备派生的),为其声明不同的DataTemplates,或者使用DataTemplateSelector(即设置ItemsControl的ItemTemplateSelector属性)。好的,我将尝试这个,但是,您可以帮助我将的Grid.Column值绑定到设备类中存在的GridProperty.Column。根据
设备
实例,
用户控件
对象的类型是否实际不同?如果不是,则不需要为视图模型声明不同的类,也不需要使用
DataTemplateSelector
。就上述内容而言,最不合适的地方是使用
private
字段,通常使用
public
属性(用于绑定)。但是如果没有一个清晰的问题陈述,并且它可靠地再现了这个问题,就不可能确切地知道你在问什么,更不用说答案了。我在问题本身中说过,类中的每个字段都有公共属性,我没有包括它们,因为这会不必要地填充空间,而且用户控件是不同类型的。这对于数据触发器来说非常容易做到,只需为用户控件添加一个样式,并为每个设备类型添加一个单独的datatrigger,从而相应地设置模板属性。