Обратное связывание WPF OneWayToSource - PullRequest
2 голосов
/ 02 марта 2010

У меня есть пользовательский элемент управления, который имеет следующее свойство зависимости

public static readonly DependencyProperty PrintCommandProperty = DependencyProperty.Register(
      "PrintCommand",
      typeof(ICommand),
      typeof(ExportPrintGridControl),
      new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.Inherits));

public ICommand PrintCommand
{
    get { return (ICommand)GetValue(PrintCommandProperty); }
    set { throw new Exception("ReadOnly Dependency Property. Use Mode=OneWayToSource"); }
}

в конструкторе моего элемента управления я устанавливаю значение по умолчанию для моего свойства:

public MyControl()
{
   this.SetValue(PrintCommandProperty, new DelegateCommand<object>(this.Print));
}

Затем я пытаюсь привязать свойство к моей модели представления, чтобы я мог получить доступ к свойству и вызвать команду печати. ​​

<controls:MyControl PrintCommand="{Binding PrintCommand, Mode=OneWayToSource}"/>

Однако привязка в XAML приводит к тому, что значение свойства устанавливается равным нулю. Если я удаляю привязку в XAML, значение свойства по умолчанию будет правильно установлено в конструкторе моего элемента управления.

Как правильно заставить мою ViewModel вызывать метод Print моего элемента управления?

Ответы [ 2 ]

0 голосов
/ 03 марта 2010

То, как вы используете привязку команд, отличается от того, как они используются в MVVM. Обычно вы объявляете объявление DelegateCommand в вашей виртуальной машине, которое будет выполнять некоторые действия в виртуальной машине на основе действия пользовательского интерфейса (например, нажатие кнопки). Поскольку вы ищете противоположный путь, вам, вероятно, будет лучше использовать событие, исходящее от вашей виртуальной машины, которое затем может быть обработано ExportPrintGridControl. В зависимости от того, как установлены отношения, вы можете объявить обработчик событий в XAML в объявлении экземпляра виртуальной машины (не похоже на это в вашем случае) или в вашем управляющем коде, просто возьмите DataContext и приведите его к ваша виртуальная машина или (лучше) интерфейс, который включает в себя событие для подписки.

p.s. Ваш DependencyProperty в настоящее время настроен так, что все, что не относится к вашему классу, может установить его, вызывая SetValue (как и все XAML). Я понимаю, почему вы настроили его таким образом, чтобы попытаться использовать его как привязку «только для push», но вот лучшая реализация «только для чтения» для ситуаций, когда вам это действительно необходимо:

private static readonly DependencyPropertyKey PrintCommandPropertyKey = DependencyProperty.RegisterReadOnly(
  "PrintCommand",
  typeof(ICommand),
  typeof(ExportPrintGridControl),
  new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.Inherits));

public static readonly DependencyProperty PrintCommandProperty = PrintCommandPropertyKey.DependencyProperty;

public ICommand PrintCommand
{
    get { return (ICommand)GetValue(PrintCommandProperty); }
    private set { SetValue(PrintCommandPropertyKey, value); }
}
0 голосов
/ 02 марта 2010

Я просто перечитал ваш вопрос, и похоже, что вы пытаетесь вызвать метод в вашем представлении из вашей модели представления. Это не то, для чего предназначена модель представления.

Если это действительно то, что вам нужно, вам не нужно использовать команду: все, что вам нужно сделать, это позвонить:

view.Print()

Если вы хотите изменить команду печати, вам нужно свойство, как показано. В этом случае модель вашего вида назовет

view.PrintCommand.Execute()

Ни в одном из этих случаев не требуется привязка данных.

Еще один способ сделать это в WPF - добавить привязку к коллекции CommandBindings вашего элемента управления для обработки встроенной команды Application.Print. Затем модель представления может отправить эту команду, используя RaiseEvent, когда она хочет напечатать.

Обратите внимание, что CommandBinding является совершенно другим объектом, чем Binding. Не путайте их. CommandBinding используется для обработки перенаправленных команд. Привязка используется для обновления значений свойств.

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