Пользовательский элемент управления привязкой WPF в DataTemplate - PullRequest
0 голосов
/ 03 апреля 2020

Я пытаюсь связать свою пользовательскую подсказку с элементами TreeView. Это XAML внутри TreeView: как вы можете видеть, я связываю свой HierarchicalDataTemplate с GroupWrapper (простой класс, который предоставляет свойства Name и Children) и DataTemplate с DocWrapper (опять же, простой Класс, который имеет такие свойства, как Name, Icon, BsonContent).

<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type tmistruct:GroupWrapper}" ItemsSource="{Binding Children}">
    <TextBlock Text="{Binding Name}" />
</HierarchicalDataTemplate>
<DataTemplate DataType="{x:Type tmistruct:DocWrapper}" >
    <StackPanel Orientation="Horizontal">
        <Image Source="{Binding Icon}"/>
        <TextBlock Text="{Binding Name}" Tag="{Binding BsonContent}" VerticalAlignment="Center" Style="{StaticResource TreeViewTextboxItemStyle}"/>
        <StackPanel.ToolTip>
            <local:MyDocTooltip   
                NameField="{Binding Name}"/>
        </StackPanel.ToolTip>
    </StackPanel>
</DataTemplate>
</TreeView.Resources>

Все отлично работает! Дерево автоматически заполняется правильным текстом и значками для всех узлов, НО ... моя пользовательская подсказка не получает памятку. Подсказка показывает , но поле имени не заполнено. Обратите внимание, что если я заменим

<local:MyDocTooltip
    NameField="{Binding Name}"/>

на:

<local:MyDocTooltip   
    NameField="TESTSTRING"/>

Тестовая строка правильно отображается во всплывающей подсказке.

Так выглядит моя пользовательская подсказка например:

namespace MyControls
{
    /// <summary>
    /// Interaction logic for MyDocTooltip.xaml
    /// </summary>
    public partial class MyDocTooltip : UserControl
    {
        public MyDocTooltip()
        {
            InitializeComponent();
            DataContext = this;
        }

        public static readonly DependencyProperty NameFieldProperty = DependencyProperty.Register("NameField", typeof(string), typeof(MyDocTooltip));
        public string NameField
        {
            get { return (string)GetValue(NameFieldProperty); }
            set { SetValue(NameFieldProperty, value); }
        }
    }
}

Я думаю, что-то связано с тем, что контекст данных моей подсказки установлен в свой собственный ViewModel? Я пытался с относительными ссылками, но безуспешно. Любая помощь приветствуется! Приветствия.

1 Ответ

0 голосов
/ 03 апреля 2020

ОК, все мои настройки были неверными. (Спасибо @ A Sh) Для тех, кто борется с подобными проблемами:

Каждый пользовательский элемент управления должен , а не установить свое свойство DataContext! Это должно быть унаследовано. Что вы делаете внутри каждого пользовательского элемента управления, так это привязывает каждый элемент к его UserControl предку. Итак, внутри MyDocTooltip.xaml каждый элемент будет определен следующим образом (привязан к NameField свойству):

<TextBlock Text="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}},Path=NameField}"/>

Затем я делаю то же самое в TreeView (который также находится внутри пользовательского элемента управления):

    <TreeView x:Name="treeViewCollection" Grid.Row="2" Grid.ColumnSpan="2"  ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}},Path=FilteredGroups, UpdateSourceTrigger=PropertyChanged}" >
        <TreeView.Resources>
            <HierarchicalDataTemplate DataType="{x:Type tmistruct:GroupWrapper}" ItemsSource="{Binding Children}">
                <TextBlock Text="{Binding Name}" />
            </HierarchicalDataTemplate>
            <DataTemplate x:Name="TreeViewDataTemplate"  DataType="{x:Type tmistruct:DocWrapper}" >
                <StackPanel Orientation="Horizontal">
                    <Image Source="{Binding Icon}"/>
                    <TextBlock Text="{Binding Name}" Tag="{Binding BsonContent}" VerticalAlignment="Center"/>
                    <StackPanel.ToolTip>
                        <local:MyDocTooltip                             
                            NameField="{Binding Name}"
                            />
                    </StackPanel.ToolTip>                        
                </StackPanel>
            </DataTemplate>
        </TreeView.Resources>
    </TreeView>

И все вроде нормально работает. Пожалуйста, дайте мне знать, если я все еще делаю это неправильно. Спасибо за помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...