尝试绑定到同一用户控件的依赖项 属性 时出错

Error while trying to bind to a dependency property of the same user-control

我正在尝试将我的 UserControl 绑定到在我的 UserControl 本身中定义的依赖项 属性,但我一直收到绑定错误:

BindingExpression path error: 'DefinitionTypeResourceKeyProperty' property not found on 'object' ''DefinitionsList' (Name='')'. BindingExpression:Path=DefinitionTypeResourceKeyProperty; DataItem='DefinitionsList' (Name=''); target element is 'ItemsControl' (Name=''); target property is 'ItemTemplate' (type 'DataTemplate')

这是我的 xaml:

<UserControl x:Class="Editor.Common.DefinitionsList"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:local="clr-namespace:Editor.Common"
             mc:Ignorable="d"
             d:DesignHeight="300" d:DesignWidth="300">
    <UserControl.Resources>
        <local:StringToResourceConverter x:Key="StringToResource" />
    </UserControl.Resources>
    <Expander>
        <Expander.ContextMenu>
            <ContextMenu>
                <MenuItem Header="Add"
                              Command="{Binding AddItem}" />
                <MenuItem Header="Remove"
                              Command="{Binding RemoveItem}" CommandParameter="{Binding SelectedItem}" />
            </ContextMenu>
        </Expander.ContextMenu>

        <Grid>
            <ItemsControl ItemsSource="{Binding Items}" ItemTemplate="{Binding DefinitionTypeResourceKeyProperty, Converter={StaticResource StringToResource}, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}">
            </ItemsControl>
        </Grid>
    </Expander>
</UserControl>

这是它的 .cs 文件:

using System.Windows;
using System.Windows.Controls;

namespace Editor.Common
{
    public partial class DefinitionsList : UserControl
    {
        public string DefinitionTypeResourceKey
        {
            get { return (string)GetValue(DefinitionTypeResourceKeyProperty); }
            set { SetValue(DefinitionTypeResourceKeyProperty, value); }
        }

        public static readonly DependencyProperty DefinitionTypeResourceKeyProperty =
            DependencyProperty.Register("DefinitionTypeResourceKey", typeof(string), typeof(DefinitionsList));

        public string Header
        {
            get { return (string)GetValue(HeaderProperty); }
            set { SetValue(HeaderProperty, value); }
        }

        public static readonly DependencyProperty HeaderProperty =
            DependencyProperty.Register("Header", typeof(string), typeof(DefinitionsList));

        public DefinitionsList()
        {
            InitializeComponent();
        }
    }
}

我将此控件用作通用列表控件,因此我可以在此列表中放置不同类型的控件。
这就是我尝试将其用于特定类型控制的方式:

<UserControl x:Class="Editor.Item.ItemEditorControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:local="clr-namespace:Editor.Item"
             xmlns:component="clr-namespace:Editor.Component"
             xmlns:common="clr-namespace:Editor.Common"
             mc:Ignorable="d"
             d:DesignHeight="300" d:DesignWidth="300">
    <UserControl.Resources>
        <DataTemplate x:Key="compListTemplate">
            <component:ComponentListEditorControl />
        </DataTemplate>
    </UserControl.Resources>
    <common:DefinitionsList Header="{Binding Name}" DefinitionTypeResourceKey="compListTemplate" />
</UserControl>

及其 .cs 文件:

使用 System.Windows.Controls;

namespace Editor.Item
{
    public partial class ItemEditorControl : UserControl
    {
        public ItemEditorControl()
        {
            InitializeComponent();
            DataContext = new ItemDefinitionViewModel();
        }
    }
}

为什么会出现此错误?

编辑:

我正在添加 ItemDefinitionViewModel 代码:

using Editor.Common;

namespace Editor.Item
{
    public class ItemDefinitionViewModel : BaseViewModel<ItemEditorItem>
    {
        public ItemDefinitionViewModel()
        {

        }
    }
}

及其基数class:

using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Windows.Input;

namespace Editor.Common
{
    public class BaseViewModel<T> : INotifyPropertyChanged
                    where T : new()
    {
        public event PropertyChangedEventHandler PropertyChanged;


        public ICommand AddItem { get; private set; }
        public ICommand RemoveItem { get; private set; }

        public ObservableCollection<T> Items { get; private set; }

        protected void RaisePropertyChangedEvent(string propertyName)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }

        public BaseViewModel()
        {
            Items = new ObservableCollection<T>();
            AddItem = new RelayCommand(addItem);
            RemoveItem = new RelayCommand(removeItem);
        }

        private void removeItem(object obj)
        {
            T removedItem = (T)obj;
            Items.Remove(removedItem);
        }

        private void addItem(object obj)
        {
            T newItem = new T();
            Items.Add(newItem);
        }
    }
}

您绑定到 DefinitionTypeResourceKeyProperty 而不是 DefinitionTypeResourceKey。您正在尝试绑定到 DP 定义而不是 DP。

我 "bothers" 的另一件事是您正在 RelativeSource RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}} 中寻找 UserControl。

相反,您应该查找 DefinitionsList。如果你改变那个,编辑器会告诉你你在 DP 名称上写错了,节省你的时间。