Предоставить свойство UserControl для XAML - PullRequest
4 голосов
/ 08 марта 2010

Элементы управления 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 Не удалось найти присоединяемое свойство 'UICommands' в типе 'ArchetypeControl'."

Предложения?

-

Учитывая комментарии, я создал тестовый элемент управления, чтобы показать весь код и воспроизвести проблему.Я использую 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».'или один из его базовых классов. "

Ответы [ 2 ]

7 голосов
/ 08 марта 2010

Посмотрите на свой XAML:

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

Здесь вы объявляете UserControl, а затем пытаетесь установить для него свойство TestControl. Поскольку UserControl не имеет свойства TestControl.TestObject, WPF не может установить это свойство для объекта UserControl. Вы можете сказать: «Но я объявляю UserControl типа TestControl. Мой UserControl равен a TestControl!» Но это не совсем так. Вышеуказанное объявление объявляет TestControl class : оно не создает экземпляр TestControl, поэтому для него не могут быть установлены свойства экземпляра.

Скорее, свойство TestObject существует для пользователей TestControl для установки на отдельные экземпляры TestControl:

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

Если вы хотите установить значение по умолчанию / начальное значение для свойства TestObject, то вы можете сделать это либо в конструкторе TestControl, либо (если TestObject является свойством зависимости) с помощью стиля по умолчанию TestControl (хотя это больше для пользовательских элементы управления, чем для пользовательских элементов управления).

1 голос
/ 08 марта 2010

Я не совсем могу воссоздать вашу проблему ... созданный мной случай, похоже, работает. Мне пришлось инициализировать список в конструкторе.

Однако из вашего примера мне интересно, что более подходящее место для вашего источника списка было бы в объекте ViewModel какого-то рода. Если вы представляете команды, то имеете IEnumerable какой-то оболочки ICommand, которая также инкапсулирует нужные вам элементы отображения (например, Caption, Icon URI и т. Д.).

ViewModels, конечно, не панацея, но в этом случае я думаю, что это позволит вам поместить все знания о командах, которые вы хотите использовать, в одно и то же место (например, которые доступны и что они делают).

...