c# - 尝试绑定(bind)到同一用户控件的依赖属性时出错

标签 c# wpf xaml binding dependency-properties

我试图将我的 UserControl 绑定(bind)到我的 UserControl 本身中定义的依赖属性,但我不断收到绑定(bind)错误:

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()
        {

        }
    }
}

及其基类:

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

最佳答案

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

另一件“困扰”我的事情是,您正在RelativeSource RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}} 中寻找 UserControl。

相反,您应该寻找定义列表。如果您进行更改,编辑器会告诉您 DP 名称有误,从而节省您的时间。

关于c# - 尝试绑定(bind)到同一用户控件的依赖属性时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37204416/

相关文章:

c# - 在 Canvas 上画圆

c# - 在 DataGrid、Silverlight 导航应用程序中选择整行

C# 从 list<decimal> 到 double 数组的转换

c# - Excel-C# : How to read the formulas from a cell?

c# - 在 WPF 中模拟按键

wpf - 将 WPF ValidationRule 的状态传递给 MVVM 中的 View 模型

c# - 将事件绑定(bind)/连接到嵌套在 ItemsControls DataTemplate 中的 ItemsControl 中的按钮

wpf - 如何使 WPF TabControl 在 Windows 窗体中显示为 MultiLine = false (默认)

c# - 更改在 vsproj 中添加为链接的文件的名称

c# - 为什么这个断言在比较结构时会抛出格式异常?