Связывание элементов управления архитектуры плагина WPF не работает - PullRequest
0 голосов
/ 10 января 2019

Мы столкнулись с интересным поведением в .Net 4.5 (4.6.2 также протестировано). В проекте есть несколько плагинов dll.

main exe загрузит DataTemplates (view) и ViewModels из DLL с использованием MEF.

  1. если StepView и StepVm и код основного кадра находятся в одном проекте (без использования MEF), работают 2 кнопки, которые я показываю ниже.
  2. если переместить StepView и StepVm в плагин dll, будет работать только вторая кнопка. Первый показывает ошибку привязки в консоли вывода. нужно поговорить с менеджером, если я могу опубликовать сообщение об ошибке здесь, просто стандартная ошибка связывания wpf.

Кто-нибудь может поделиться некоторыми соображениями здесь? Спасибо.

StepView

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

StepVm

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}");
    });
}

1 Ответ

0 голосов
/ 10 января 2019

Поскольку MEF загружает ваш UserControl динамически в Visual Tree, у вас, скорее всего, будут проблемы с NameScope, что, я думаю, и происходит здесь.

WPF XAML Namescopes

Если честно, использование привязки ElementName проблематично, потому что вы находитесь в DateTemplate, который является границей инкапсуляции, поэтому, хотя он работает вне MEF, это обычно не поддерживаемый сценарий.

...