【问题标题】:Property binding to a Child UserControl绑定到子用户控件的属性
【发布时间】:2019-04-17 11:31:16
【问题描述】:

我遇到了一个直到现在都无法解决的问题: 我正在用 C#/WPF 开发一个应用程序,并使用 Caliburn.micro 作为框架。我有多个菜单面板(作为用户控件),我想在整个应用程序中重用它们(例如网格的数据过滤菜单)并显示在 <ContentControl /> 中。根据应用程序的状态,可以显示不同的菜单面板。

现在我可以设法让事件从菜单的 View 冒泡到父级的 ViewModel。但我被属性困住了: 例如,在过滤菜单中,应在立即应用过滤器时输入文本。当我在父视图中有菜单时,这很容易:我只是在属性的 setter 方法中进行了过滤。

是否有可能制作一种类似于 c.m 中消息冒泡的“属性冒泡”(它必须是双向的!)?还是任何其他(更好的)MVVM 兼容方法?

提前致谢!

一月


小例子:

ParentView.xaml

<UserControl x:Class="App.ParentView">
    <Grid>
        <ContentControl x:Name="Toolbar" />
    </Grid> 
</UserControl>

ParentViewModel.cs

class ParentViewModel : Screen
{
    public ParentViewModel()
    {
        Toolbar = new MenuViewModel();
    }

    private Screen _toolbar;
    public Screen Toolbar
    {
        // get, set ...
    }

    public void LoadDifferentMenu()
    {
        this.Toolbar = new DifferentMenuViewModel();
    }
}

MenuView.xaml

<UserControl x:Class="App.MenuView">
    <Grid>
        <TextBox x:Name="MyText" />
    </Grid>
</UserControl>

MenuViewModel.cs

class MenuViewModel : Screen
{
    public MenuViewModel()
    {   
    }

    private string _myText;
    public string MyText
    {
        // get, set...
    }
}

【问题讨论】:

  • 如果 TextBox 数据绑定到视图模型的某个属性,那么它与事件没有什么不同 - 您可能只是对 PropertyChanged 事件(或您有什么)做出反应并传递信息,对吧?

标签: c# wpf mvvm data-binding caliburn.micro


【解决方案1】:

在 caliburn micro 中使用 Event Aggregator 在 MVVM 中实现发布者和订阅者模式。

通信是基于消息类型的,因此它可以用于适当类型的单向或双向通信。

具体实现请参考链接https://caliburnmicro.com/documentation/event-aggregator

【讨论】:

  • 好的,但如果我没看错的话,事件就是一种单向的通信方式。因此,例如,如果我想清除文本框,我必须向子菜单的 VM 添加更多逻辑。有没有办法让这种双向“绑定”开箱即用?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-06
  • 2012-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多