c# - 绑定到子用户控件的属性
问题描述
我有一个问题直到现在都无法解决:我正在用 C#/WPF 开发一个应用程序,并且正在使用 Caliburn.micro 作为框架。我有多个菜单面板(作为用户控件),我想在整个应用程序中重用它们(例如网格的数据过滤菜单)并显示在<ContentControl />
. 根据应用程序的状态,可以显示不同的菜单面板。
现在我可以设法让事件从菜单的视图冒泡到父视图模型。但我坚持使用属性:例如在过滤菜单中,应该在立即应用过滤器时输入文本。当我在父视图中有菜单时,这很容易:我只是在属性的 setter 方法中进行了过滤。
是否有可能制作一种类似于以 cm 为单位的消息冒泡的“属性冒泡”(它必须是双向的!)?还是任何其他(更好的)MVVM 兼容方法?
提前致谢!
简
最小的例子:
父视图.xaml
<UserControl x:Class="App.ParentView">
<Grid>
<ContentControl x:Name="Toolbar" />
</Grid>
</UserControl>
父视图模型.cs
class ParentViewModel : Screen
{
public ParentViewModel()
{
Toolbar = new MenuViewModel();
}
private Screen _toolbar;
public Screen Toolbar
{
// get, set ...
}
public void LoadDifferentMenu()
{
this.Toolbar = new DifferentMenuViewModel();
}
}
菜单视图.xaml
<UserControl x:Class="App.MenuView">
<Grid>
<TextBox x:Name="MyText" />
</Grid>
</UserControl>
菜单视图模型.cs
class MenuViewModel : Screen
{
public MenuViewModel()
{
}
private string _myText;
public string MyText
{
// get, set...
}
}
解决方案
在 caliburn micro 中使用Event Aggregator
以在 MVVM 中实现发布者和订阅者模式。
通信基于消息类型,因此它可以用于适当类型的单向或双向通信。
请参阅链接https://caliburnmicro.com/documentation/event-aggregator了解实施细节。
推荐阅读
- python - Matplotlib 更精确的 python
- python-3.x - 遍历文件夹以打开特定类型的文件
- javascript - 移动标记后在弹出窗口中查看 latlng
- mono - 无法为 Ubuntu 18.04 获取/安装最新的单声道版本
- spring - 无法显示来自 Spring Cloud Vault Connection 的日志
- laravel - Laravel Passport Token 的响应速度很慢
- java - 在 Kubernetes 上实现节点发现
- php - 运行 PHP 命令会导致 Xdebug 错误
- fft - MSGEQ7 功能
- terraform-provider-azure - 带有 Terraform 的 Azure DevOps 管道在 arm_xxx 参数上失败