Если у нас будет необычная генерация кода, думаю, я бы предпочел способ более легкой генерации DependancyProperties.Фрагмент, который я использую, безусловно, полезен, но я не фанат того, как перемешивается код, когда у вас есть изменения и принудительные обратные вызовы и параметры метаданных.Может быть, я попробую макет образца после работы.
Редактировать: Ну, вот одна концепция.Было бы намного умнее, если вы передадите анонимные методы атрибутам, но это все еще на шаг вперед.
До:
[DpDefault("The Void")]
[DpCoerce(new CoerceValueCallback(MainWindow.CoerceAddress))]
[DpChanged(new PropertyChangedCallback(MainWindow.ChangeAddress1))]
[DpChanged(new PropertyChangedCallback(MainWindow.ChangeAddress2))]
[DpOptions(FrameworkPropertyMetadataOptions.Inherits)]
public string Address {
get { return Dp.Get<string>(); }
set {
if (Dp.Get<string>() != value) {
Dp.Set(value);
PostOffice.SendMailToTheBoss("I moved!");
}
}
}
После:
public string Address {
get { return (string)GetValue(AddressProperty); }
set {
if ((string)GetValue(AddressProperty) != value) {
SetValue(AddressProperty, value);
PostOffice.SendMailToTheBoss("I moved!");
}
}
}
public static readonly DependencyProperty AddressProperty =
DependencyProperty.Register("Address", typeof(string), typeof(MainWindow),
new FrameworkPropertyMetadata((string)"The Void",
FrameworkPropertyMetadataOptions.Inherits,
new PropertyChangedCallback(MainWindow.ChangeAddress1)
+ new PropertyChangedCallback(MainWindow.ChangeAddress2),
new CoerceValueCallback(MainWindow.CoerceAddress)));
Обычно используется только атрибут «DpDefault», но даже если он не делает код короче, он, безусловно, делает его более понятным.Вот более типичный пример:
До:
[DpDefault("The Void")]
public string Address { get; set; }
После:
public string Address {
get { return (string)GetValue(AddressProperty); }
set { SetValue(AddressProperty, value); }
}
public static readonly DependencyProperty AddressProperty =
DependencyProperty.Register("Address", typeof(string), typeof(MainWindow),
new UIPropertyMetadata((string)"The Void"));