c# - WPF插件架构项目控件绑定不起作用
问题描述
我们在 .Net 4.5(4.6.2 也经过测试)上遇到了一个有趣的行为。该项目有多个插件 dll。
main exe 将使用 MEF 从 DLL 加载 DataTemplates(视图)和 ViewModels。
- 如果 StepView 和 StepVm 以及主机代码在一个项目中(不使用 MEF),我在下面显示的 2 个按钮正在工作。
- 如果将 StepView 和 StepVm 移动到插件 dll,则只有第二个按钮可以使用。第一个显示输出控制台中的绑定错误。如果我可以在这里发布错误消息,需要与经理交谈,只是 wpf 标准绑定错误。
有人可以在这里分享一些见解吗?谢谢。
步进视图
<UserControl
x:Class="StepView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:ScriptHighlighter"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
d:DataContext="{d:DesignInstance local:StepVm}"
d:DesignHeight="450"
d:DesignWidth="800"
mc:Ignorable="d">
<Grid>
<ItemsControl x:Name="XItemsControl" ItemsSource="{Binding Names}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel>
<Button
Content="Not Wokring in plugin mode"
Command="{Binding ElementName=XItemsControl, Path=DataContext.DeleteCommand}"
CommandParameter="{Binding}" />
<Button
Content="Wokrs in plugin mode"
Command="{Binding Path=DataContext.DeleteCommand, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}, Mode=FindAncestor}}"
CommandParameter="{Binding}" />
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Grid>
步进向量
public class StepVm:ViewModelBase
{
public StepVm()
{
this.Names = new List<string>(){"1", "2", "3"};
}
public List<string> Names { get; set; }
public ICommand DeleteCommand => new RelayCommand<string>(n =>
{
Debug.WriteLine($"logic to delete {n}");
});
}
解决方案
因为 MEF 将您的 UserControl 动态加载到 Visual Tree 中,所以您可能会遇到 NameScope 问题,我认为这就是这里发生的情况。
老实说,您对ElementName
绑定的使用是有问题的,因为您处于DateTemplate
封装边界中,因此尽管它在 MEF 之外工作,但它通常不是受支持的场景。
推荐阅读
- azure-devops - 从 Application Insights 在 Azure DevOps 中“创建工作项”需要哪些角色
- javascript - Vue.js:在下拉菜单中管理多个按钮
- python - Django本地内存缓存在heroku上不起作用
- php - Slim 4 - 未捕获的类型错误:传递给 {closure}() 的参数 1 必须是 RouterCollectorProxy 的实例
- r - ggplot2 刻面标签 - 不显示第二行
- php - 如果选中 ACF 子字段,则隐藏行
- shell - 如果 ZDOTDIR 设置为自定义文件夹,则 PyCharm zsh shell 没有完整的用户 PATH 变量
- hana - 在 HANA 上同时更新 2 个连接表?
- java - Java Spring如何使用名称进行映射
- javascript - React Hooks:处理多个输入