簡體   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