[英]Error while trying to bind to a dependency property of the same user-control
我试图将我的 UserControl 绑定到我的 UserControl 本身中定义的依赖属性,但我不断收到绑定错误:
BindingExpression 路径错误:在“object”“DefinitionsList”(Name='')'上找不到“DefinitionTypeResourceKeyProperty”属性。 BindingExpression:Path=DefinitionTypeResourceKeyProperty; DataItem='DefinitionsList' (Name=''); 目标元素是 'ItemsControl' (Name=''); 目标属性是“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);
}
}
}
您绑定到 DefinitionTypeResourceKeyProperty 而不是 DefinitionTypeResourceKey。 您正在尝试绑定到 DP 定义而不是 DP。
“困扰”我的另一件事是您正在您的 RelativeSource RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}
寻找RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}
。
相反,您应该查找 DefinitionsList。 如果您更改它,编辑器会告诉您 DP 名称有误,从而节省您的时间。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.