[英]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.