Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.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中的视图模型_C#_Wpf_Mvvm - Fatal编程技术网

C# 在视图之间共享对象&;MVVM中的视图模型

C# 在视图之间共享对象&;MVVM中的视图模型,c#,wpf,mvvm,C#,Wpf,Mvvm,我是WPF+MVVM的新手,在了解viewmodels时遇到了麻烦 我有一个名为FSystem的对象,它包含大量从XML填充的列表 public class FSystem : ObservableObject { public List<FUser> _userList; public List<FZone> _zoneList; public List<FSource> _sourceList; public string

我是WPF+MVVM的新手,在了解viewmodels时遇到了麻烦

我有一个名为FSystem的对象,它包含大量从XML填充的列表

public class FSystem : ObservableObject
{
    public List<FUser> _userList;
    public List<FZone> _zoneList;
    public List<FSource> _sourceList;

    public string _projectName { get; set; }
    private string _projectVersion { get; set; }
    private string _processorIp { get; set; }

    private bool _isMultiLingualModeOn { get; set; }

    private int _systemIncludeLighting { get; set; }
    private int _systemIncludeWindowsTreatments { get; set; }
    private int _systemIncludeSip { get; set; }
    private int _systemIncludeCamaras { get; set; }

    public FSystem()
    {
        UserList = new List<FUser>();
    }
}
这是下面的MainViewModel,它包含了加载XML和属性FSystem的命令,我希望在其他视图模型中使用这些命令

public class MainViewModel : ViewModel 
{
    private Fystem fSystem;
    public FSystem FSystem
    {
        get { return fSystem; }
        private set
        {
            fSystem = value;
            NotifyPropertyChanged("FSystem");
        }
    }

    public MainViewModel()
    {
        InitiateState();
        WireCommands();
    }

    private void InitiateState()
    {
        FSystem = new FSystem();
    }

    private void WireCommands()
    {
        XDocumentLoadCommand = new RelayCommand(XDocumentLoad) {IsEnabled = true};

        ClearDataCommand = new RelayCommand(ClearData) {IsEnabled = true};
    }
public RelayCommand XDocumentLoadCommand { get; private set; }
    private void XDocumentLoad()
    {
        var openDlg = new OpenFileDialog
        {
            Title = "Open .FAS",
            DefaultExt = ".fas",
            Filter = "F System Files (*.fas)|*.fas",
            Multiselect = false
        };

        bool? result = openDlg.ShowDialog() == DialogResult.OK;
        if (result != true) return;

        FSystem = XMLParsers.ParseByXDocument(openDlg.FileName);
    }
该应用程序基本上允许用户更改不同的对象(FUser、FZone、FSource等)。我的想法是,用户将加载XML,然后能够在不同的视图上编辑不同的列表对象

在MVVM中,正确的方法是什么


我计划(希望)让用户、区域和源视图显示数据网格,这些数据网格由模型中各自的数据填充。

创建特定的视图模型,并使用依赖项注入将相关数据传递给它们(此列表或该列表)

这样,视图模型就不需要了解其他内容,您可以轻松地模拟它进行测试,并在设计器上查看虚拟数据

对于最简单的示例,请将粘贴复制到Linqpad中。两个模拟视图模型都有一个依赖项(在本例中为i)。您只需传递您的列表:

void Main()
{
    int someInt = 5;
    int anotherInt = 7;

    VM vm1 = new VM(someInt);
    VM vm2 = new VM(anotherInt);

    vm1.RevealI();
    vm2.RevealI();
}

public class VM{
    private int _i;

    public VM(int i)
    {
        _i = i; 
    }

    public void RevealI() { Console.WriteLine("value of i is: " + _i); }
}
除此之外,还有更多的项目:


创建特定的视图模型,并使用依赖项注入将相关数据传递给它们(此列表或该列表)

这样,视图模型就不需要了解其他内容,您可以轻松地模拟它进行测试,并在设计器上查看虚拟数据

对于最简单的示例,请将粘贴复制到Linqpad中。两个模拟视图模型都有一个依赖项(在本例中为i)。您只需传递您的列表:

void Main()
{
    int someInt = 5;
    int anotherInt = 7;

    VM vm1 = new VM(someInt);
    VM vm2 = new VM(anotherInt);

    vm1.RevealI();
    vm2.RevealI();
}

public class VM{
    private int _i;

    public VM(int i)
    {
        _i = i; 
    }

    public void RevealI() { Console.WriteLine("value of i is: " + _i); }
}
除此之外,还有更多的项目:


嘿,诺蒂斯,谢谢你的回复。很抱歉成为那个家伙,但你能通过链接一个指南或一个模拟片段为我指出正确的方向吗?我以前没有使用依赖注入,所以不知道什么与我正在做的事情相关,是的,我有:)。我刚刚读了你留下的依赖注入项目。根据我收集的信息,我应该将FSystem传递到我的ViewModels/UserControls中,以便可以使用它们。我只是在想,如果FSystem为null(如果用户从头开始构建/创建XML),我如何允许用户打开其他视图。如果为null,要么不打开视图,要么让他们知道他们没有数据。更好的是,传递一个新创建的对象,他们可以手动填充…嘿,Noctis,感谢您的响应。很抱歉成为那个家伙,但你能通过链接一个指南或一个模拟片段为我指出正确的方向吗?我以前没有使用依赖注入,所以不知道什么与我正在做的事情相关,是的,我有:)。我刚刚读了你留下的依赖注入项目。根据我收集的信息,我应该将FSystem传递到我的ViewModels/UserControls中,以便可以使用它们。我只是在想,如果FSystem为null(如果用户从头开始构建/创建XML),我如何允许用户打开其他视图。如果为null,要么不打开视图,要么让他们知道他们没有数据。更好的是,传递一个新创建的对象,他们可以手动填充它。。。