Очень странная проблема привязки: команды и пользовательские свойства - PullRequest
0 голосов
/ 20 августа 2010

Вот верхняя часть моего 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')


Кто-нибудь знает, что происходит с моими привязками?

1 Ответ

1 голос
/ 20 августа 2010

«Не удается найти источник для привязки»

Я подозреваю, что Framework: текстовый текст DialogMetadata не является вашей ViewModel.Вы должны проверить это, и если это не так, вам нужно передать Datacontext вашего UserControl в DialogMetaData.

Я должен признать, что неправильно понимаю материал <Framework:DialogMetadata.Instance>, поэтому я просто пытаюсь указать на симптомыа не болезнь.: D

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...