Функция C #, вызываемая после установки свойства зависимости - PullRequest
2 голосов
/ 15 марта 2010

Мой код в настоящее время выглядит так:

private Foo myFoo;

public Foo CurrentFoo
{
    get { return myFoo; }
    set { SetFoo(value); }
}

private void SetFoo(Foo newFoo)
{
    // Do stuff
    // Here be dragons

    myFoo = newFoo;
}

Чтобы иметь возможность связать его в XAML / WPF, мне нужно превратить Foo в свойство зависимости:

public static DependencyProperty CurrentFooProperty = 
    DependencyProperty.Register("CurrentFoo", typeof(Foo), 
        typeof(FooHandler), new PropertyMetadata(false));        

public Foo CurrentFoo
{
    get { return (Foo)GetValue(CurrentFooProperty); }
    set { SetValue(CurrentFooProperty, value); }
}

Я слышал, что вы не должны делать магию внутри фактического набора свойств C # {}, так как он может не вызываться, но значение записывается непосредственно в свойство зависимостей. Если это неверно, дайте мне знать, это кажется самым очевидным и простым путем.

Я знаю, что могу добавить функцию проверки к свойству зависимости, но я предполагаю, что ее не следует использовать для этого? Мне нужно сообщить об изменении в унаследованные системы, которые еще не могут быть связаны в XAML.

Как лучше всего подойти к этой проблеме?

Ответы [ 2 ]

4 голосов
/ 15 марта 2010
public static DependencyProperty CurrentFooProperty = DependencyProperty.Register(
    "CurrentFoo",
    typeof(Foo), 
    typeof(FooHandler),
    new PropertyMetadata(OnCurrentFooChanged));

private static void OnCurrentFooChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    var currentFoo = (Foo) e.NewValue;

    // Use
}
1 голос
/ 15 марта 2010

Это должно быть обработано обратным вызовом, назначенным свойству зависимости. Правильное место для этого зависит от того, что на самом деле здесь происходит:

// Do stuff
// Here be dragons

Существует три обратных вызова, которые можно назначить свойству зависимости - если вам просто нужно уведомить устаревшие системы, тогда я рекомендую добавить обратный вызов Property Changed и уведомление там.

Если, однако, он выполняет что-то, что равнозначно проверке через устаревшую систему, может быть более целесообразным поместить этих драконов в ValidationCallback.

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

...