Вот верхняя часть моего usercontrol:
<UserControl x:Class="MyApp.Common.Controls.Views.SimpleView"
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:Framework="http://www.memoryexpress.com/UIFramework"
mc:Ignorable="d"
Height="130" Width="450"
x:Name="Master"
>
<!-- Behaviour under the context of the generic dialog -->
<Framework:DialogMetadata.Instance>
<Framework:DialogMetadata SizeToContent="WidthAndHeight"
ResizeMode="NoResize"
ConfirmCommand="{Binding ConfirmCommand, RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type UserControl}}}"
ConfirmButtonText="Run"/>
</Framework:DialogMetadata.Instance>
Короче говоря, у меня есть UserControl, и я определил присоединенное свойство: DialogMetadata.Instance
, которое принимает объект типа DialogMetadata
. Эта конструкция представляет собой просто список прикрепленных свойств, которые я могу использовать, если я когда-либо запускаю этот элемент управления в качестве отдельного диалога.
Это все работает по большей части, у меня есть это, взяв SizeToContent
, ResizeMode
и ConfirmButtonText
.
Однако, в духе MVVM Я хочу передать эту команду в диалог, который будет выполнен, когда мы нажмем кнопку «Подтвердить». Итак, как вы можете видеть, я пытался связать команду из ViewModel в ConfirmCommand DialogMetadata DependencyProperty.
DP определяется следующим образом:
#region DP - ConfirmCommand
public static DependencyProperty ConfirmCommandProperty =
DependencyProperty.Register("ConfirmCommand", typeof (IBaseCommand), typeof (DialogMetadata),
new PropertyMetadata(null));
/// <summary>
/// The Confirmation Command for a dialog. This allows us to sync up to the user-control for
/// determining if we can can hit the Ok Button, and to perform additional logic
/// </summary>
public virtual IBaseCommand ConfirmCommand
{
get { return GetValue(ConfirmCommandProperty) as IBaseCommand; }
set { SetValue(ConfirmCommandProperty, value); }
}
#endregion
Однако, когда я выполняю привязку, как в первом блоке кода: (Примечание: свойство 'ConfirmCommand' существует в контексте данных UserControl и имеет ненулевое значение.)
Binding
{Binding ConfirmCommand, RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type UserControl}}}
Error
System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.UserControl', AncestorLevel='1''. BindingExpression:Path=ConfirmCommand; DataItem=null; target element is 'DialogMetadata' (Name=''); target property is 'ConfirmCommand' (type 'IBaseCommand')
Binding
{Binding ConfirmCommand, ElementName=Master}
Error
System.Windows.Data Error: 4 : Cannot find source for binding with reference 'ElementName=Master'. BindingExpression:Path=ConfirmCommand; DataItem=null; target element is 'DialogMetadata' (Name=''); target property is 'ConfirmCommand' (type 'IBaseCommand')
Кто-нибудь знает, что происходит с моими привязками?