/ / Dlaczego DependencyProperty zastępuje normalne zachowanie wiązania właściwości? - wpf, wiążące

Dlaczego DependencyProperty przesłania normalne zachowanie powiązania właściwości? - wpf, powiązanie

Od czasu do czasu napotkałem problem. oto prosty przykład:

Kod Xaml:

<Window x:Class="WPFProperties.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525"
x:Name="root">
<Grid>
<TextBox Text="{Binding Text,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged,ElementName=root}"/>
</Grid>
</Window>

Kod za:

public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}

//// Using a DependencyProperty as the backing store for Text.  This enables animation, styling, binding, etc...
//public static readonly DependencyProperty TextProperty =
//    DependencyProperty.Register("Text", typeof(string), typeof(MainWindow), new UIPropertyMetadata(null));

private string _text;

public string Text
{
get { return _text; }
set
{
if (this._text == value) return;
_text = value;

this.DoSomething();
}
}

private void DoSomething()
{
// Do Someting
}
}

Metoda DoSomething () może zostać wywołana podczas pisania w polu tekstowym. ale gdy odkomentuję właściwość zależności „Tekst”, nigdy nie zostanie ona wywołana.

Uwaga: Znam podstawowe użycie właściwości zależności.

Odpowiedzi:

2 dla odpowiedzi № 1

musisz utworzyć UIPropertyMetaData przy pomocycallback (PropertyChangedCallback propertyChangedCallback), która powinna być metodą statyczną, w której należy wywołać właściwość update po przekazanym DependancyObject

przykład wyjaśniono tutaj: MSDN


2 dla odpowiedzi nr 2

Cóż, AFAIK, nie dzieje się tutaj normalna deklaracja własności, ponieważ kiedy deklarowany jest DP, to jest static który jest inicjalizowany na samym początku, zanim zostaną utworzone nawet normalne obiekty, i ma pierwszeństwo.

Dlatego właściwość w klasie jest po prostu traktowana jako normalna właściwość pomocnika DP zamiast czegoś, co wygląda jak właściwość nowego członka klasy. Zatem wewnętrzne elementy wiążące wykorzystują tylko wewnętrzne SetValue(...) lub GetValue(...) bezpośrednio omijając twój over-ride, co jest normalnym zachowaniem dla DP.

Kiedy DP nie zostanie zadeklarowany, staje się to normalną własnością klasy i dlatego widzimy twoją DoSomething() nazywa.

Znowu nawet z definicją DP nie skomentowano, jeśli zadzwonimy Text = "Anything" w konstruktorze MainWindow możemy zobaczyć DoDomething() wywoływane, ponieważ w taki sposób działa DP, gdzie nazywany jest lokalny pomocnik. Tylko wiązania wiążą się z definicją podstawową