我正在将 C# WPF 应用程序转换为 MVVM 模式并有几个问题:
我有一个 ViewModel 绑定到具有构造函数的模型,该构造函数需要参数,该参数是从返回到搜索查询的 JSON 列表中选择单个对象的结果。我想这意味着在执行搜索之前我无法实例化这个 ViewModel。
以前这不是问题,因为我不需要将 View 数据绑定到 ViewModel,并且只在所有数据都到位并且我准备好用它做一些事情时从 GUI 收集文本值来实例化对象(模型) .
对于 MVVM,这是一个问题,因为我不想强制此搜索成为第一个用户操作——用户应该能够修改 GUI 中绑定到 ViewModel 的任何字段。
处理这种情况的一些实用方法是什么?似乎我必须要么:a)在实例化 VM 之前等待选择搜索结果,或者 b)从构造函数中删除参数,而是创建一个将在实例化的 VM 上调用的方法,以计算/设置否则由构造函数设置。
第二个问题:如何实现搜索功能——即点击搜索按钮后如何暂存结果列表?以前我会反序列化 SearchButton_Click 方法中的列表,并将组合框的绑定设置为结果集合。使用 MVVM,我无法描绘返回结果列表和选择单个结果之间的状态。我是否创建一个单独的 ViewModel,其中包含绑定到组合框的空目标类型列表和绑定到搜索文本框的 SearchTerm 属性,并从 SearchButton 命令 ICommand 填充组合框?然后如何将所选项目绑定到我的原始视图模型?
视图模型:
class ObjectViewModel
{
public CustomObject data;
public ICommand Search;
public ObjectViewModel()
{
this.data = new CustomObject();
}
}
模型:
[DataContract]
public class User
{
[DataMember(Name = "EmailAddress")]
public string EmailAddress { get; set; }
[DataMember(Name = "FirstName")]
public string FirstName { get; set; }
[DataMember(Name = "FullName")]
public string FullName { get; set; }
...
}
[DataContract]
public class CustomObject
{
public User Owner;
...
}
查看(尚未重写):
<TextBox Margin="5,0" Name="Owner"></TextBox>
<Button Name="Search" Content="Lookup" Click="OwnerLookUp_Click"></Button>
<ComboBox Name="OwnerMatches" SelectionChanged="OwnerMatches_SelectionChanged" Visibility="Hidden"/>
OwnerLookUp_Click 从 Owner 文本框中获取文本并返回 ObservableCollection 并将其绑定到 OwnerMatches。OwnerMatches_SelectionChanged 将 Owner 文本框设置为所选项目的 Fullname 属性。
在这种情况下,我要绑定到 ObjectViewModel 中的 data.Owner 什么?