Die Abhängigkeitseigenschaft ist statischer Natur. Wenn ich also eine benutzerdefinierte Abhängigkeitseigenschaft bool type namens "IsGrayProperty" erstelle und sie auf zwei Schaltflächen implementiere. Dann, wenn ich den Wert in btn1 gesetzt, warum soll es nicht in btn2 reflektiert werden, da die DependencyProperty statisch ist und sie eine NET-Wrapper-Eigenschaft „IsGray“Mechanismus der Abhängigkeitseigenschaft
Antwort
Die statische Nur-Lese-DependencyProperty
IsGrayProperty
ist eine Kennung namens - ein Schlüsselwert, sozusagen. Es enthält auch Metadaten über die Eigenschaft. Es ist nicht die eigentliche Eigenschaft selbst. Jede DependencyObject
Instanz speichert ihre eigenen DependencyProperty
Werte intern.
Abhängigkeitseigenschaften sind semantisch sehr viel wie normale Instanzeigenschaften, aber sie haben zusätzliche Funktionen, die sie Dinge tun lassen, dass regelmäßige Instanz Eigenschaften nicht (zum Beispiel Sie ihre Metadaten zur Laufzeit, auf regelmäßigen Gegensatz Attributes
ändern Eigenschaften, und Sie können angefügte Eigenschaften erstellen). Deshalb existieren sie.
Zum Beispiel ist TextBlock.Text
eine Abhängigkeitseigenschaft.
//
// Summary:
// Identifies the System.Windows.Controls.TextBlock.Text dependency property.
//
// Returns:
// The identifier of the System.Windows.Controls.TextBlock.Text dependency property.
[CommonDependencyProperty]
public static readonly DependencyProperty TextProperty;
Und es ist eine "normale Eigenschaft" Wrapper bekam auch:
//
// Summary:
// Gets or sets the text contents of a System.Windows.Controls.TextBlock.
//
// Returns:
// The text contents of this System.Windows.Controls.TextBlock. Note that all
// non-text content is stripped out, resulting in a plain text representation
// of the System.Windows.Controls.TextBlock contents. The default is System.String.Empty.
[Localizability(LocalizationCategory.Text)]
public string Text { get; set; }
Wenn Sie die Text
eines TextBlock
gesetzt, tut jedem anderen TextBlock
Aktien den gleichen Text? Nein natürlich nicht. Und wenn sie das täten, wären Abhängigkeitseigenschaften völlig nutzlos.
Der Parameter DependencyProperty
zu GetValue
teilt dem DependencyObject
mit, welcher Wert aus dem internen Speicher des Eigenschaftswerts des Abhängigkeitsobjekts abgerufen werden soll. Wenn der Wert in der DependencyProperty
selbst gespeichert wäre, würden Sie die DependencyProperty
, nicht die DependencyObject
abfragen.
public void ForExample(TextBlock tb)
{
var oldtext = tb.GetValue(TextBlock.TextProperty) as String;
tb.SetValue(TextBlock.TextProperty, "Test value");
}
Wenn es nur einen globalen Wert für TextBlock.TextProperty
ist, und es wird gespeichert inTextBlock.TextProperty
, warum auf der Erde sind wir GetValue()
und SetValue()
auf einige zufällige Instanz TextBlock
nennen? Warum überhaupt eine bestimmte Instanz ins Spiel bringen?
Stattdessen würden wir TextBlock.TextProperty.SetValue()
anrufen.
Es ist wie ein Wörterbuch:
var d1 = new Dictionary<String, Object>();
var d2 = new Dictionary<String, Object>();
var keyValue = "Foo";
d1.Add(keyValue, 32);
Console.WriteLine(d2[keyValue]);
Was würden Sie von d2[keyValue]
erwarten? Sie würden nichts erwarten, weil Sie d2
nie einen Wert für keyValue
gegeben haben. d1.Add("Foo",32)
speichert die Ganzzahl 32
nicht in der Zeichenfolge "Foo"
. Es speichert es in das Wörterbuch.
Jedes Wörterbuch speichert seine eigenen Schlüsselwerte. Jede DependencyObject
speichert eigene Eigenschaftswerte. Intern speichert es sie wahrscheinlich in ein Dictionary
; warum nicht? Wenn die.NET-Team könnte eine effizientere Möglichkeit zum Speichern von Schlüssel/Wert-Paaren als Dictionary
schreiben, sie hätten es Dictionary
genannt.
Wenn Sie eine Vorstellung davon haben, was eine Sprache oder ein Framework-Feature bedeutet, fragen Sie sich immer: "Wenn meine Idee wahr wäre, wäre das Feature völlig nutzlos oder massiv schädlich?" Wenn die Antwort auf diese Frage "Ja" ist, dann haben Sie falsch geraten, was das Merkmal bedeutet. Das ist zu 100% garantiert, da Entwickler und Implementierer von Sprachen und Frameworks normalerweise keine Monate damit verschwenden, Features zu entwerfen, die völlig nutzlos sind (classes in Perl 5 come close, though).
Danke Ed, yeah Sie haben Recht, aber nicht bekommen, wie eine statische Eigenschaft verschiedene Werte für verschiedene Steuerelemente haben kann, obwohl GetValue, Setvalue am Ende Zugriff auf die statische Eigenschaft readonly – Raj
Es ist genau das Abrufen von Elementen aus einem Wörterbuch: ' var foo = new Dictionary
Was wirklich statisch ist, ist die Abhängigkeit Eigenschaftendeskriptor:
public static readonly DependencyProperty IsGrayProperty =
DependencyProperty.Register(
"IsGray",
typeof(bool),
typeof(MyButton));
Der Deskriptor enthält nur Metadaten über das Objekt, und es seinen Wert nicht enthalten.
Die tatsächliche Eigenschaft, die mit Daten verwendet wird, die Bindung und von Code zugegriffen wird, ist die Instanz ein:
public bool IsGray
{
get
{
return (bool)GetValue(IsGrayProperty);
}
set
{
SetValue(IsGrayProperty, value);
}
}
wie Sie sehen können, ist es Delegierten bekommen und DependencyObject
zu Instanzmethoden GetValue
und SetValue
der Basis.
Intern verwaltet DependencyObject
ein Array von Einträgen (in einem Instanzfeld), in dem die tatsächlichen Werte seiner Abhängigkeitseigenschaften gespeichert werden. Jede Instanz hat ihr eigenes Array und der tatsächliche Wert befindet sich in einem der Einträge. Daher wird es niemals mit anderen Instanzen geteilt. Daher ändert SetValue
den Status der aktuellen Schaltflächeninstanz und nicht einen statischen Status.
Der statische wird IsGrayProperty
Deskriptor nur verwendet, um einen Index in die Eintragsmatrix, um zu bestimmen, führen Validierungen usw. Die Tatsache, dass IsGrayProperty
statisch ist, ist es ein wenig über anti-intuitive, zu denken, aber dennoch sind, Abhängigkeitseigenschaftswerte pro Instanz des Abhängigkeitsobjekts und werden nicht geteilt.
Dank Felix, mit GetValue und SetValue, ich greife auf die registrierte statische IsGrayproperty, in diesem Fall wird die statische Eigenschaft nur einen Wert zu einem Zeitpunkt haben, so dass für alle die Kontrolle dasselbe implementiert sein sollte, aber das tut nicht Ich möchte wissen, wie die Abhängigkeitseigenschaft tatsächlich funktioniert – Raj
Nein, nein, nein. Mit GetValue und SetValue greifen Sie auf ein Instanzfeld zu, das ein Array von Einträgen enthält, die für jede Instanz privat sind. Der IsGrayProperty-Deskriptor wird nur verwendet, um einen Index in das Array zu ermitteln, Validierungen durchzuführen usw. Der tatsächliche Wert, der von GetValue und SetValue gelesen und geschrieben wird, befindet sich im Eintragsarray und jede Instanz hat ihr eigenes Eintragsarray. Die Tatsache, dass IsGrayProperty statisch ist, macht es etwas anti-intuitiv, darüber nachzudenken, aber die Werte der Abhängigkeitseigenschaft sind pro Instanz und werden nicht geteilt. –
Weil btn2 nicht das Attribut von btn1 referenziert. – Adam