Я пытаюсь использовать шаблон MVVM в своем приложении Silverlight 3, и у меня возникают проблемы с привязкой к свойству команды рабочей модели представления. Во-первых, я пытаюсь добавить прикрепленное свойство под названием ClickCommand, например:
public static class Command
{
public static readonly DependencyProperty ClickCommandProperty =
DependencyProperty.RegisterAttached(
"ClickCommand", typeof(Command<RoutedEventHandler>),
typeof(Command), null);
public static Command<RoutedEventHandler> GetClickCommand(
DependencyObject target)
{
return target.GetValue(ClickCommandProperty)
as Command<RoutedEventHandler>;
}
public static void SetClickCommand(
DependencyObject target, Command<RoutedEventHandler> value)
{
// Breakpoints here are never reached
var btn = target as ButtonBase;
if (btn != null)
{
var oldValue = GetClickCommand(target);
btn.Click -= oldValue.Action;
target.SetValue(ClickCommandProperty, value);
btn.Click += value.Action;
}
}
}
Общий класс Command является оболочкой для делегата. Я только обертываю делегата, потому что мне было интересно, если тип делегата для свойства был причиной, по которой вещи не работали для меня изначально. Вот этот класс:
public class Command<T> /* I'm not allowed to constrain T to a delegate type */
{
public Command(T action)
{
this.Action = action;
}
public T Action { get; set; }
}
Вот как я использую прикрепленное свойство:
<Button u:Command.ClickCommand="{Binding DoThatThing}" Content="New"/>
Синтаксис, кажется, принят, и я думаю, что когда я тестировал все это со строковым типом свойства, это работало нормально. Вот класс модели представления, к которому привязан:
public class MyViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged = delegate { };
public Command<RoutedEventHandler> DoThatThing
{
get
{
return new Command<RoutedEventHandler>(
(s, e) => Debug.WriteLine("Never output!"));
}
}
}
Делегат, содержащийся в свойстве Command, никогда не вызывается. Кроме того, когда я размещаю точки останова в получателе и установщике присоединенного свойства, они никогда не достигаются.
Пытаясь изолировать проблему, я изменил тип свойства на строку; точка останова в геттере и сеттере также никогда не достигалась, но бросив в них исключение, приложение завершилось, поэтому я думаю, что это эксцентричность фреймворка.
Почему этот материал не работает? Я также приветствую альтернативные, надеюсь, более простые способы привязки обработчиков событий для просмотра моделей.