我正在做我的第一个WPF/XAML项目,还有很多东西我还没有弄清楚。
我的问题很简单-我需要一个在顶部有一堆字段的窗口,用户可以在其中输入他的选择条件、一个检索按钮和一个数据网格。当用户单击该按钮时,将运行查询,并使用结果填充网格。
现在,实现这一点的简单、明显和错误的方法是,使用包含单个窗口的单个模块,并在其中包含所有内容-输入字段、数据网格、工程。这种职责的混乱造成了无法维护的混乱。
因此,我有一个窗口,它只负责布局,它包含两个用户控件-一个包含输入字段和检索按钮的criteria控件,以及一个包含数据网格的数据显示控件。
问题是如何让这两个人互相交谈。
几年前,我会添加一个指向criteria控件的函数指针。该窗口会将其设置为指向显示控件中的函数,并且当单击该按钮时,它会调用显示控件,传递选择条件。
最近,我会在criteria控件中添加一个事件。我会让窗口在显示控件中设置一个处理程序来侦听事件,并且当单击按钮时,它会引发事件。
在WPF中,这两种机制都可以工作。但这两个都不是很XAMLish。在我看来,WPF专门提供了ICommand接口来解决这类连接问题,但我还没有真正弄清楚它们是如何工作的。而且我见过的例子似乎都不符合我的简单场景。
有没有人能给我一些关于如何让ICommand解决这个问题的建议?或者直接在网上给我一个像样的解释?
谢谢!
发布于 2012-02-10 04:31:42
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);
}
}https://stackoverflow.com/questions/9218249
复制相似问题