【发布时间】:2013-09-11 19:25:14
【问题描述】:
我正在将 C# WPF 应用程序转换为 MVVM 模式并且有几个问题:
我有一个 ViewModel 绑定到一个带有构造函数的模型,该构造函数需要参数,该参数是从返回到搜索查询的 JSON 列表中选择单个对象的结果。 我想这意味着在执行搜索之前我无法实例化这个 ViewModel。
这不是以前的问题,因为我不需要将 View 数据绑定到 ViewModel,并且只在所有数据都准备好并且我准备好时从 GUI 收集文本值来实例化对象(模型)有什么用。
对于 MVVM,这是一个问题,因为我不想强制此搜索成为第一个用户操作——用户应该能够修改绑定到 ViewModel 的 GUI 中的任何字段。
处理这种情况有哪些实用的方法?似乎我必须要么: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 什么?
【问题讨论】:
-
老兄,文字太多,没有示例代码。我不会通读这一切。顺便说一句,MVVM 不是问题,非 MVVM 是。