WPF控件具有某些属性(UserControl.Resources,UserControl.CommandBindings),这些属性可以从用户控件声明的XAML中添加项目。例如:
<UserControl ... >
<UserControl.CommandBindings>
...
</UserControl.CommandBindings>
<UserControl.Resources>
...
</UserControl.Resources>
</UserControl>
我在用户控件中定义了一个新的列表属性:
public partial class ArchetypeControl : UserControl {
...
public List<Object> UICommands { get; set; }
我想像资源和CommandBindings一样向这个列表添加项目,但是当我这样做时:
<c:ArchetypeControl.UICommands>
</c:ArchetypeControl.UICommands>
我收到错误“错误4在'ArchetypeControl'类型中找不到可附加属性'UICommands'。”
建议?
鉴于评论,我创建了一个测试控件来显示整个代码并重现问题。我正在使用visual studio 2010。
<UserControl x:Class="ArchetypesUI.TestControl"
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:c="clr-namespace:ArchetypesUI"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<c:TestControl.TestObject>
</c:TestControl.TestObject>
<Grid>
</Grid>
</UserControl>
-
namespace ArchetypesUI
{
/// <summary>
/// Interaction logic for TestControl.xaml
/// </summary>
public partial class TestControl : UserControl
{
public Object TestObject { get; set; }
public TestControl()
{
InitializeComponent();
}
}
}
现在我得到的错误是“错误2附加属性'TestControl.TestObject'未在'UserControl'或其基类之一上定义。”
答案 0 :(得分:7)
看看你的XAML:
<UserControl>
^^^^^^^^^^^
<c:TestControl.TestObject>
^^^^^^^^^^^
</c:TestControl.TestObject>
</UserControl>
在这里,您声明一个UserControl,然后尝试在其上设置TestControl属性。由于UserControl没有TestControl.TestObject属性,因此WPF无法在UserControl对象上设置该属性。你可能会说,“但我正在声明一个TestControl类型的UserControl。我的UserControl 是一个TestControl!”但事实并非如此。上面的声明声明了TestControl 类:它没有创建TestControl的实例,所以它不能在其上设置实例属性。
而是,TestControl的用户的TestObject属性可以在TestControl的各个实例上设置:
<local:TestControl>
<local:TestControl.TestObject> <!-- Now it will work -->
</local:TestControl.TestObject>
</local:TestControl>
如果要为TestObject属性设置默认/初始值,则可以通过TestControl默认样式在TestControl构造函数中执行此操作,或者(如果TestObject是依赖项属性)(尽管这更适用于自定义)控件而不是用户控件。)
答案 1 :(得分:1)
我无法重新创建您的问题......我创建的案例似乎有效。我必须在构造函数中初始化列表。
但是,从您的示例中我想知道列表源的更合适的位置是某种ViewModel对象。如果您正在公开命令,那么拥有某种ICommand包装器的IEnumerable,它也会封装您需要的显示元素(例如Caption,Icon URI等)。
ViewModels肯定不是灵丹妙药,但在这种情况下,我认为它可以让你把所有想要使用的命令的知识放在同一个地方(例如可用的和他们做的)。