Процесс дизайнера завершен в пользовательском элементе управления с привязкой содержимого

#c# #wpf #visual-studio #mvvm #dependency-properties

#c# #wpf #visual-studio #mvvm #зависимость-свойства

Вопрос:

Я создал пользовательский пользовательский элемент управления из Gruopbox. Однако, чтобы его можно было использовать в качестве контейнера в представлении, я должен создать DependecyProperty для Content . Это приводит к Unhandled Exception has occurred ошибке в VS2017.

Изображение ошибки

Это, однако, происходит только тогда, когда я привязываю Content атрибут в gruopbox к моему новому свойству.

 <UserControl
    x:Class="Infrastructure.Controls.GroupBox.CollectionBox"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    x:Name="Form"
    d:DesignHeight="450"
    d:DesignWidth="800"
    mc:Ignorable="d">

    <GroupBox Content="{Binding Content, ElementName=Form}"/>

</UserControl>
  

С кодом, стоящим за

 public new object Content
    {
        get => (object)GetValue(ContentProperty);
        set => SetValue(ContentProperty, value);
    }
public new static readonly DependencyProperty ContentProperty = DependencyProperty.Register(nameof(Content), typeof(object), typeof(CollectionBox), new PropertyMetadata(null));
  

Я попытался использовать FalloutValue при привязке к другим элементам управления, поскольку предполагал, что дизайнер не знал, что поместить внутрь контейнера. Тем не менее, ошибка продолжает возникать.

Во время выполнения и в конструкторе представлений элемент управления выглядит и работает нормально. Я не вижу этого только в его конструкторе.

Спасибо.

Комментарии:

1. Почему бы вам просто не создать GroupBox вместо UserControl , который содержит GroupBox ? Измените корневой элемент в вашем XAML и базовый класс класса, лежащего в основе кода, с UserControl на GroupBox .

2. @mm8 Примером является упрощение элемента управления, поскольку я обнаружил, что ошибка возникает из-за этой привязки. Под этим я подразумеваю, что GroupBox находится внутри другого контейнера с другими элементами управления.

3. Что, если создать пользовательский шаблон для UserControl ?

4. И как бы это решило проблему привязки содержимого?

5. Вам не нужно привязывать. Вы просто включаете <ContentPresenter /> в шаблон.

Ответ №1:

Вам не нужно другое свойство содержимого, просто другой ControlTemplate, который определяет визуальную структуру вашего элемента управления, включая GroupBox, который привязывается к элементу управления Content :

 <UserControl x:Class="Infrastructure.Controls.GroupBox.CollectionBox" ...>
    <UserControl.Template>
        <ControlTemplate TargetType="UserControl">
            <Border> <!-- or any other control(s) here -->
                <GroupBox Content="{TemplateBinding Content}"/>
            </Border>
        </ControlTemplate>
    </UserControl.Template>
</UserControl>
  

Комментарии:

1. Вот и все. Спасибо