Как правильно выставить свойства внутреннего контроля? - PullRequest
0 голосов
/ 15 мая 2018

У меня есть пользовательский элемент управления с именем CustomTreeView, который содержит TreeView.Я хотел бы предоставить свойство SelectedItem TreeView пользователям пользовательского элемента управления.

Для этого я попытался добавить новое свойство зависимостей в пользовательский элемент управления и связать это свойство со свойством SelectedItem TreeView.

К сожалению, похоже, что оно неправильно.,Не могли бы вы взглянуть?

TreeView.xaml

<UserControl x:Class="Fis.UI.Windows.BacNet.Views.RestructuredView.View.Controls.CustomTreeView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             Selected="{Binding ElementName=treeView, Path=SelectedItem}">
   <TreeView x:Name="treeView"/>
</UserControl>

TreeView.xaml.cs

public partial class CustomTreeView : UserControl
    {
        public static readonly DependencyProperty IsSelectedProperty = DependencyProperty.Register(
                                                                                             "Selected", typeof(Node),
                                                                                             typeof(TreeView)
                                                                                             );
        public Node Selected
        {
            get { return (Node)GetValue(IsSelectedProperty); }
            set { SetValue(IsSelectedProperty, value); }
        }

        public TreeView()
        {
            InitializeComponent();
        }
    }

Спасибо!

1 Ответ

0 голосов
/ 15 мая 2018

Часть вашего решения в этом ответе здесь .Это ответ только для ссылки с мертвой ссылкой (или был - я только что улучшил его), но он упоминает ключевой момент.

Вы не можете связать TreeView.SelectedItem.Ваше определение свойства зависимости нарушается несколькими способами, и оно должно называться SelectedItem в соответствии со стандартной практикой WPF.Ниже приведен код usercontrol, который определяет свойство зависимости вместе с обработчиками событий в качестве замены привязки.

public partial class CustomTreeView : UserControl
{
    public CustomTreeView()
    {
        InitializeComponent();
    }

    #region SelectedItem Property
    public Node SelectedItem
    {
        get { return (Node)GetValue(SelectedProperty); }
        set { SetValue(SelectedProperty, value); }
    }

    public static readonly DependencyProperty SelectedProperty =
        DependencyProperty.Register(nameof(SelectedItem), typeof(Node), typeof(CustomTreeView),
            new FrameworkPropertyMetadata(null,
                                          FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,
                                          Selected_PropertyChanged)
            { DefaultUpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged });

    protected static void Selected_PropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        (d as CustomTreeView).OnSelectedChanged(e.OldValue);
    }

    private void OnSelectedChanged(object oldValue)
    {
        if (SelectedItem != treeView.SelectedItem)
        {
            var tvi = treeView.ItemContainerGenerator.ContainerFromItem(SelectedItem) as TreeViewItem;

            if (tvi != null)
            {
                tvi.IsSelected = true;
            }
        }
    }
    #endregion SelectedItem Property

    private void treeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
    {
        if (SelectedItem != e.NewValue)
        {
            SelectedItem = e.NewValue as Node;
        }
    }
}

А вот TreeView в XAML UserControl.Я опускаю ItemsSource и ItemTemplate как не относящиеся к делу.

<TreeView
    x:Name="treeView"
    SelectedItemChanged="treeView_SelectedItemChanged"
    />

А вот фрагмент из MainWindow.xaml, который я использовал для его проверки:

<StackPanel>
    <local:CustomTreeView x:Name="treeControl" />
    <Label 
        Content="{Binding SelectedItem.Text, ElementName=treeControl}"
        />
</StackPanel>

Мой класс Node имеет свойство Text, и я заполняю деревочерез DataContext, чтобы избавить от необходимости устанавливать другое свойство зависимости для элементов.

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