用户控件通过命令进行通信 - 如何?
问题描述:
我正在WPF/XAML中处理我的第一个项目,并且还有很多我没弄清楚。用户控件通过命令进行通信 - 如何?
我的问题很简单 - 我需要一个窗口,在顶部有一堆字段,用户将使用它输入他的选择标准,检索按钮和数据网格。当用户点击按钮时,将运行查询,并使用结果填充网格。
现在,实现这一点的简单而明显的错误方法是让一个单独的模块包含一个窗口,并在其中包含所有内容 - 输入字段,数据网格和工程。这种责任的磨损使得不可维护的混乱。
所以我所拥有的是一个窗口,它只负责布局,它包含两个用户控件 - 一个包含输入字段和检索按钮的条件控件,以及一个包含数据网格的数据显示控件。
问题是如何让两个人互相交谈。
年前,我会添加一个指向标准控件的函数指针。窗口将它设置为指向显示控件中的一个函数,并且当单击该按钮时,它将调用显示控件,传递选择标准。
最近,我会添加一个事件到标准控制。我会让窗口在显示控件中设置一个处理程序来监听事件,并且当按钮被点击时,它会引发事件。
这两种机制都可以在WPF中工作。但是这两个都不是XAMLish。在我看来,WPF已经专门提供了ICommand接口来适应这些类型的连接问题,但我还没有真正弄清楚它们是如何工作的。而且我看到的例子都不符合我的简单情况。
任何人都可以给我一些关于如何适应ICommand这个问题的建议吗?或者直接在网上给我一个体面的解释?
谢谢!
答
MVVM是WPF和Silverlight开发中使用的流行模式。你应该阅读它。
本质上,你将有一个视图模型,公开一个命令来执行搜索。相同的视图模型也会显示每个标准字段的属性。然后,将期(县)将绑定到视图模型的各种属性:
<TextBox Text="{Binding NameCriteria}"/>
...
<Button Command="{Binding SearchCommand}".../>
...
<DataGrid ItemsSource="{Binding Results}"/>
如果您的视图模型看起来是这样的:
public class MyViewModel : ViewModel
{
private readonly ICommand searchCommand;
private string nameCriteria;
public MyViewModel()
{
this.searchCommand = new DelegateCommand(this.OnSearch, this.CanSearch);
}
public ICommand SearchCommand
{
get { return this.searchCommand; }
}
public string NameCriteria
{
get { return this.nameCriteria; }
set
{
if (this.nameCriteria != value)
{
this.nameCriteria = value;
this.OnPropertyChanged(() => this.NameCriteria);
}
}
}
private void OnSearch()
{
// search logic, do in background with BackgroundWorker or TPL, then set Results property when done (omitted for brevity)
}
private bool CanSearch()
{
// whatever pre-conditions to searching you want here
return !string.IsEmpty(this.NameCriteria);
}
}
是的,我使用的视图模型。我没有提到它,因为这不是问题所在。我可以在显示控件的视图模型中定义一个方法,并公开执行它的命令。将它绑定到显示控件视图中的UI元素将很简单。但那不是我的问题。我需要从UI控件触发命令,该控件没有 - 也不应该 - 访问显示控件的视图模型。 – 2012-02-09 20:40:40
@Jeff:在这种情况下,只需使用一个事件聚合器,它允许分离的组件进行协作。棱镜有一个,或者你可以从其他地方抓一个或写你自己的。 – 2012-02-10 07:37:18
这似乎是严重矫枉过正的问题,因为两个控件在同一窗口中彼此交谈时受到限制。 – 2012-02-10 14:14:03