首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用户控件通过命令进行通信-如何进行?

用户控件通过命令进行通信-如何进行?
EN

Stack Overflow用户
提问于 2012-02-10 04:28:08
回答 1查看 192关注 0票数 0

我正在做我的第一个WPF/XAML项目,还有很多东西我还没有弄清楚。

我的问题很简单-我需要一个在顶部有一堆字段的窗口,用户可以在其中输入他的选择条件、一个检索按钮和一个数据网格。当用户单击该按钮时,将运行查询,并使用结果填充网格。

现在,实现这一点的简单、明显和错误的方法是,使用包含单个窗口的单个模块,并在其中包含所有内容-输入字段、数据网格、工程。这种职责的混乱造成了无法维护的混乱。

因此,我有一个窗口,它只负责布局,它包含两个用户控件-一个包含输入字段和检索按钮的criteria控件,以及一个包含数据网格的数据显示控件。

问题是如何让这两个人互相交谈。

几年前,我会添加一个指向criteria控件的函数指针。该窗口会将其设置为指向显示控件中的函数,并且当单击该按钮时,它会调用显示控件,传递选择条件。

最近,我会在criteria控件中添加一个事件。我会让窗口在显示控件中设置一个处理程序来侦听事件,并且当单击按钮时,它会引发事件。

在WPF中,这两种机制都可以工作。但这两个都不是很XAMLish。在我看来,WPF专门提供了ICommand接口来解决这类连接问题,但我还没有真正弄清楚它们是如何工作的。而且我见过的例子似乎都不符合我的简单场景。

有没有人能给我一些关于如何让ICommand解决这个问题的建议?或者直接在网上给我一个像样的解释?

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2012-02-10 04:31:42

MVVM是用于WPF和Silverlight开发的流行模式。你应该对它有个了解。

从本质上讲,您将拥有一个视图模型,该模型公开了执行搜索的命令。该视图模型还将公开每个条件字段的属性。然后,视图将绑定到视图模型上的各种属性:

代码语言:javascript
运行
复制
<TextBox Text="{Binding NameCriteria}"/>

...

<Button Command="{Binding SearchCommand}".../>

...

<DataGrid ItemsSource="{Binding Results}"/>

您的视图模型将如下所示:

代码语言:javascript
运行
复制
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);
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9218249

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档