属性绑定到子用户控件

时间:2018-11-14 13:21:25

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

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

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

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

谢谢!

Jan


最小示例:

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...
    }
}

1 个答案:

答案 0 :(得分:0)

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

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

请参见链接https://caliburnmicro.com/documentation/event-aggregator,以了解实现的详细信息。