#c# #wpf #data-binding #dependency-properties
#c# #wpf #привязка к данным #зависимость-свойства
Вопрос:
Я пытаюсь привязать все мое окно к базовому usercontrol, чтобы позволить этому usercontrol управлять поведением родительского окна. Например, я хотел бы закрыть родительское окно из UserControl. Я хочу создать пользовательскую строку заголовка, которую я могу повторно использовать в других окнах. Я пытался использовать
<views:TitlebarUserCtrl BoundWindow="{Binding ElementName=Window1, Mode=OneWay}" ></views:TitlebarUserCtrl>
.
public static readonly DependencyProperty BoundCurrentWindow = DependencyProperty.Register("BoundWindow", typeof(Window), typeof(TitlebarUserCtrl), new UIPropertyMetadata(""));
public Window BoundWindow
{
get
{
return (Window)GetValue(BoundCurrentWindow);
}
set
{
SetValue(BoundCurrentWindow, value);
}
}
Но я получаю только ошибку. Есть предложения?
Комментарии:
1. непонятно, чего вы пытаетесь достичь
2. Я хочу иметь возможность закрыть окно, например, из usercontrol. Я хочу, чтобы иметь возможность вызывать Window. Close() из usercontrol.
3. Какие ошибки? Ваш код действительно работает на моей стороне. Окно привязано. Кстати — существует соглашение заканчивать свойство dependency свойством . То есть
BoundWindowProperty
4. Ошибка: System. Windows. Разметка. Исключение XamlParseException: «Вызов конструктора типа ‘HWInterfaceChromaScan.Views. TitlebarUserCtrl’ который соответствует указанным ограничениям привязки, вызвал исключение.’ Номер строки ’54’ и позиция строки ’14’.’ Исключение TypeInitializationException: инициализатор типа для ‘HWInterfaceChromaScan.Views. TitlebarUserCtrl’ выдал исключение. Исключение ArgumentException: тип значения по умолчанию не соответствует типу свойства ‘BoundWindow’.
5. Вы когда-нибудь думали о создании собственного стиля окна / шаблона, а затем определении собственного пользовательского элемента управления window с вашими личными свойствами hooks / labels / caption и т.д.? Затем вы можете применить визуальный вид по всем направлениям и использовать ваше пользовательское окно в качестве базового для других?
Ответ №1:
Спасибо за любую помощь. Я не знаю, что не работало. Я очистил папку obj, и ошибка исчезла. Редактировать: и я установил UIPropertyMetadata («») в null — это, казалось, исправило ситуацию.
Вот правильный код:
C#
public static readonly DependencyProperty BoundCurrentWindow = DependencyProperty.Register("BoundWindowProperty", typeof(Window), typeof(TitlebarUserCtrl), null);
public Window BoundWindowProperty
{
get
{
return (Window)GetValue(BoundCurrentWindow);
}
set
{
SetValue(BoundCurrentWindow, value);
}
}
WPF
<views:TitlebarUserCtrl BoundWindowProperty="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}" />
Комментарии:
1. Это решение, которое я рекомендовал, используя find ancestor… но рад, что это помогло вам
2. Да, я добавил это, чтобы оно выглядело приятнее. Спасибо за помощь.
3. Это не то, как вы используете stack overflow. Если вы получите справку, и это сработает для вас, вы отмечаете ответ как решения
4. Но ваш ответ не является решением. Предлагаемый вами код работает, но это не имеет никакого значения. Мой XAML тоже сработал. Ошибка все еще была там. Я знаю, как это работает — спасибо!
5. Я могу сделать это за 3 часа… Существует ограничение по времени.
Ответ №2:
Вы можете привязаться к своему окну, используя относительный источник, который ищет элемент управления Window-Type:
<views:TitlebarUserCtrl BoundWindow="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}"/>
Комментарии:
1. Это работает, как и xaml, который я написал выше. Однако ваше решение намного приятнее. Проблема заключалась в том, что вместо этого мне пришлось указать new UIPropertyMetadata («») равным null.