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

时间:2016-05-13 07:58:13

标签: c# wpf xaml binding dependency-properties

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

  

BindingExpression路径错误:'DefinitionTypeResourceKeyProperty'   在'object'''DefinitionsList'(Name ='')'上找不到属性。   BindingExpression:路径= DefinitionTypeResourceKeyProperty;   DataItem ='DefinitionsList'(Name ='');目标元素是'ItemsControl'   (名称= ''); target属性是'ItemTemplate'(类型'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);
        }
    }
}

1 个答案:

答案 0 :(得分:2)

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

&#34;烦恼&#34;我是你在RelativeSource RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}中寻找UserControl。

相反,您应该寻找DefinitionsList。如果你改变了,编辑会告诉你你在DP名称上犯了错误,节省你的时间。