gpt4 book ai didi

c# - 在 MVVM 中的 View 和 View 模型之间共享对象

转载 作者:行者123 更新时间:2023-12-03 10:43:35 24 4
gpt4 key购买 nike

我是 WPF + MVVM 的新手,在使用 View 模型时遇到了麻烦。

我有一个名为 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>();
}
}

这是当用户将 XML 加载到应用程序时调用的 XMLParser。
public static class XMLParsers
{
public static FSystem ParseByXDocument(string xmlPath)
{
var fSystem = new FSystem();

XDocument doc = XDocument.Load(xmlPath);

XElement fSystemElement = doc.Element("FSystem");

if (fSystemElement != null)
{
fSystem.ProjectName = fSystemElement.Element("ProjectName").Value;
fSystem.ProjectVersion = fSystemElement.Element("ProjectVersion").Value;
fSystem.ProcessorIp = fSystemElement.Element("ProcessorIP").Value;
fSystem.ProcessorFilePath = fSystemElement.Element("ProcessorFilePath").Value;
fSystem.SystemIncludeLighting = Convert.ToInt16(fSystemElement.Element("SystemIncludeLighting").Value);
fSystem.SystemIncludeSip = Convert.ToInt16(fSystemElement.Element("SystemIncludeLighting").Value);
fSystem.SystemIncludeCamaras = Convert.ToInt16(fSystemElement.Element("SystemIncludeCameras").Value);
}

fSystem.UserList = (from user in doc.Descendants("FUser")
select new FUser()
{
Id = user.Element("Id").Value,
Name = user.Element("Name").Value,
Icon = user.Element("IconColour").Value,
Pin = user.Element("UserPin").Value,
IsPinEnabled = Convert.ToBoolean(Convert.ToInt16(user.Element("UserPinEnabled").Value)),
ListIndex = user.Element("ListIndex").Value
}).ToList();

return fSystem;
}
}

这是下面的 MainViewModel,它包含加载 XML 的命令和我希望在其他 View 模型中使用的属性 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,然后能够在不同的 View 上编辑不同的列表对象。

在 MVVM 中解决这个问题的正确方法是什么?

我计划(希望)让 User、Zone 和 Source View 显示 Datagrids,这些 Datagrids 填充了来自模型的各自数据。

最佳答案

创建您特定的 View 模型,并使用依赖注入(inject)将相关数据传递给它们(这个列表或那个列表)。

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

复制粘贴到 Linqpad 是最简单的例子。两个模拟 View 模型都具有依赖关系(在我们的例子中是 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); }
}

除此之外,这里还有更多项目:
  • MSDN
  • Code Project
  • stack overflow
  • 关于c# - 在 MVVM 中的 View 和 View 模型之间共享对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39367164/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com