#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. Вот и все. Спасибо