繁体   English   中英

将UserControl属性公开给XAML

[英]Expose UserControl property to XAML

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'或其基类之一上定义。”

看看你的XAML:

<UserControl>
 ^^^^^^^^^^^
    <c:TestControl.TestObject>
       ^^^^^^^^^^^
    </c:TestControl.TestObject>
</UserControl>

在这里,您声明一个UserControl,然后尝试在其上设置TestControl属性。 由于UserControl没有TestControl.TestObject属性,因此WPF无法在UserControl对象上设置该属性。 你可能会说,“但我正在声明一个TestControl类型的UserControl。我的UserControl 一个TestControl!” 但事实并非如此。 上面的声明是声明TestControl :它不是创建TestControl的实例 ,因此它不能在其上设置实例属性。

而是,TestControl的用户可以在TestControl的各个实例上设置TestObject属性:

<local:TestControl>
  <local:TestControl.TestObject>  <!-- Now it will work -->
  </local:TestControl.TestObject>
</local:TestControl>

如果要为TestObject属性设置默认/初始值,则可以在TestControl构造函数中执行此操作,或者(如果TestObject是依赖项属性)通过TestControl默认样式执行此操作(尽管这对于自定义控件比对于用户控件)。

我无法重新创建你的问题...我创建的案例似乎有效。 我必须在构造函数中初始化列表。

但是,从您的示例中我想知道列表源的更合适的位置将在某种类型的ViewModel对象上。 如果您正在公开命令,那么拥有某种ICommand包装器的IEnumerable,它也会封装您需要的显示元素(例如Caption,Icon URI等)。

ViewModels肯定不是灵丹妙药,但在这种情况下,我认为它可以让你把你想要使用的命令的所有知识放在同一个地方(例如可用的和他们做的)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM