Я использую библиотеку, которой требуются мои представления для реализации интерфейса, который является только свойством зависимости и для него используется метод доступа get \ set.Единственное отличие - это OwnerType в методе регистрации DP.AFAIK, дублированный код - это плохо, и я забыл изменить OwnerType после нескольких вставок сейчас :) Так что я решил попробовать перенести это в базовый класс, чтобы он определил тип.После некоторого возни, я заставил его работать, инициализировав его в конструкторе с помощью GetType () для определения типа.Единственная проблема заключается в том, что представление уничтожается и создается заново позже, что вызывает ArgumentException, что DP уже зарегистрирован.
- Является ли этот рефакторинг хорошей идеей?
- Я делаюэто правильно?:)
- Если 1 и 2 истинны, как я могу проверить, зарегистрирован ли DP уже?
@ Carl: Я не уверен, что свойства зависимости когда-либо были незарегистрированными,Я даже не уверен, могут ли свойства зависимости быть незарегистрированными:)
Здесь был оригинальный класс, код для представления xaml (этот и его базовый класс - мои творения):
[ViewnameToViewLookupKeyMetadata("StartView", typeof (StartView))]
public partial class StartView : IWorkSpaceAware
{
public EditorStartView()
{
InitializeComponent();
}
public static readonly DependencyProperty WorkSpaceContextualDataProperty =
DependencyProperty.Register("WorkSpaceContextualData", typeof(object), typeof(StartView),
new FrameworkPropertyMetadata((WorkspaceData)null));
public WorkspaceData WorkSpaceContextualData
{
get { return (WorkspaceData) GetValue(WorkSpaceContextualDataProperty); }
set { SetValue(WorkSpaceContextualDataProperty, value); }
}
}
Атрибут метаданных просто связывает строку поиска с типом.
Я думаю, что это работает, потому что регистр выполняется только один раз, когда представление создается впервые.
Вбазовый класс Register, кажется, должен быть в конструкторе, поэтому я могу использовать GetType () в качестве OwnerType.Таким образом, когда представление создается снова, оно пытается зарегистрироваться снова, вызывая ArgumentException.
Интерфейс прост:
public interface IWorkSpaceAware
{
WorkspaceData WorkSpaceContextualData { get; set; }
}
Найдено решение:
Я изменилЗарегистрируйте OwnerType для typeof (MyViewBase) и поместите назначение обратно в поле.