Databinding an eine Methode in WPF
Ich habe Probleme bei Datenbindung für ein TextBox.Text
- Eigenschaft, um ein Objekt Methode. Die Idee ist, das dem Benutzer erlaubt zu schreiben TextBox
eine Datei Namen und dann haben TextBlock
Ausgabe, die Datei-Endung.
class GetFileInfo
{
public string GetFileExtension(string fileName)
{
return Path.GetExtension(fileName);
}
}
Hier ist mein XAML:
<Window.Resources>
<ObjectDataProvider x:Key="getFileInfo" MethodName="GetFileExtension" ObjectType="{x:Type local:GetFileInfo}">
<ObjectDataProvider.MethodParameters>
<sys:String>abc.text</sys:String>
</ObjectDataProvider.MethodParameters>
</ObjectDataProvider>
</Window.Resources>
<StackPanel>
<TextBox Name="textBox1">
<TextBox.Text>
<Binding Source="{StaticResource getFileInfo}" Path="MethodParameters[0]" BindsDirectlyToSource="True" UpdateSourceTrigger="PropertyChanged" />
</TextBox.Text>
</TextBox>
<TextBlock Name="textBlock1" Text="{Binding Source={StaticResource getFileInfo}}"/>
</StackPanel>
Aus irgendeinem Grund ist es nicht etwas zu tun. Anyknow hinweisen könnten, was könnten die Gründe sein?
Hier ist, was ich sehe, auf der designer und wenn ich die Anwendung ausführen:
alt-text http://img64.imageshack.us/img64/6922/f0rki14feo3oa3groxm5kgm.png
Und hier ist, was passiert, wenn ich versuche, eine andere Einstellung text zur Laufzeit:
alt-text http://img684.imageshack.us/img684/1057/b52pnq1dm4i23qivizvpaqq.png
Hier ist der Fehler gegeben durch die de-debugger wenn Sie versuchen, einen anderen text zur Laufzeit:
System.Windows.Datenfehler: 8 : speichern Nicht Wert vom Ziel zurück zur Quelle. BindingExpression:Path=MethodParameters[0]; DataItem='ObjectDataProvider' (HashCode=2207369); target element is 'TextBox' (Name='textBox1'); target-Eigenschaft 'Text' (Typ 'String') ArgumentException:'System.ArgumentException: das Objekt des Typs " MS. Internal.Daten.PropertyPathWorker+IListIndexerArg' kann nicht konvertiert werden, um den Typ 'System.Int32'.
System.RuntimeType.TryChangeType(Object value, Binder Binder, CultureInfo culture, Boolean needsSpecialCast)
System.RuntimeType.CheckValue(Object value, Binder Binder, CultureInfo culture, BindingFlags invokeAttr)
System.Reflexion.MethodBase.CheckArguments(Object [] - Parameter, Binder Binder, BindingFlags invokeAttr, CultureInfo culture, Signatur sig)
System.Reflexion.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder Binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks)
System.Reflexion.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder Binder, Object[] parameters, CultureInfo culture)
System.Reflexion.RuntimePropertyInfo.SetValue(Object obj, Object value, BindingFlags invokeAttr, Binder Binder, Object[] index, CultureInfo culture)
bei MS. Internal.Daten.PropertyPathWorker.SetValue(Object Element, Object Wert)
bei MS. Internal.Daten.ClrBindingWorker.UpdateValue(Object Wert)
System.Windows.Daten.BindingExpression.UpdateSource(Object value)'
+1 für eine Frage hat, wird helfen, eine Menge Menschen, die das nicht verstehen, databinding.
InformationsquelleAutor devoured elysium | 2010-02-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Obwohl es möglich ist, verwenden Sie
Binding
eine Methode aufrufen und bekommen Ihren Wert zurück, es ist nicht einfach. Es ist viel einfacher zu binden, um die Eigenschaften und die Verwendung der Kombination von Bindung und änderung Benachrichtigung, um das Ergebnis zu erhalten, die Sie suchen.Erstellen Sie eine Klasse mit zwei Eigenschaften
Filename
undExtension
.Filename
ist nur eine lese - /schreib-string-Eigenschaft.Extension
ist ein read-only string property, deren getter ruft die Methode, die Sie versuchen zu nennen.Nun machen, dass die Klasse implementieren
INotifyPropertyChanged
, denn wenn eine Eigenschaft kann sich ändern im code, es muss ein Weg, zu sagen, die Bindung, die es so getan hat. Machen die setter von derFilename
Eigentum Benachrichtigen Bindungen, dieExtension
Eigenschaft geändert hat.Hinzufügen
Binding
zu einemTextBox
bindet an dieFilename
Eigenschaft, die über dieTwoWay
- Modus. Hinzufügen einesBinding
zu einemTextBox
bindet anExtension
mit dem Standard -OneWay
- Modus.Die Reihenfolge der Ereignisse ist:
Filename
in einer gebundenenTextBox
und TAB drückt.TextBox
Fokus verliert.Binding
's-Modus istTwoWay
, und es ist die Standard-Verhalten der Aktualisierung der Quelle, wenn das Ziel den Fokus verliert, das ist, was es tut.Binding
updates der Quelle durch Aufruf derFilename
setter.Filename
setter wirftPropertyChanged
.Binding
GriffePropertyChanged
sieht sich in seiner Argumentation, und sieht, dass dieExtension
Eigenschaft geändert hat.Binding
ruft dieExtension
Eigenschaft getter.Extension
Eigenschaft getter ruft die Methode zu bestimmen, die Erweiterung fürFilename
und zurückBinding
.Binding
updates, die Ihr Ziel nichtTextBox
mit dem neuen Wert vonExtension
.Dies ist der Kern der zugrunde liegenden Konzept des data binding und das MVVM-Muster. Sobald Sie es verstehen, es wird zur zweiten Natur, und WPF-Entwicklung wird über zehn Millionen mal einfacher.
InformationsquelleAutor Robert Rossney
Sieht aus wie Sie benötigen, um ein Verständnis dafür MVVM , überprüfen Sie diese klassischen Artikel
http://msdn.microsoft.com/en-us/magazine/dd419663.aspx
InformationsquelleAutor Jobi Joy
Datenbindung erfordert die
NotifyPropertyChanged
Ereignis aufgerufen werden, wenn die Quelle aktualisiert wird. In diesem Fall würden Sie wollen, wickeln Sie diese Funktion aufrufen, die in einer get - /set-wie so:Wenn Sie es vorziehen, zu tun, in der richtigen WPF Weg, dies sollte der code, den Sie verwenden müssen. Es gibt nichts verrücktes passiert in dem obigen code, wenn Sie lernen, das es ist, ist gonna helfen Sie immer mit WPF. in jedem MVVM-basierten WPF können Sie sehen, dieses kleine Stück code-snippet. So ist es Wert lernen.
Ich sehe Ihren Punkt. Ich werde lernen, es auf diese Weise dann.
Aber wo soll dieser gestellt werden? Sollte FileExtension ein Fenster Eigentum?
InformationsquelleAutor apandit
Ok, scheint so, das ein Fehler beim ausführen von WPF 4.0, wie gesehen werden kann in den Kommentaren hier.
Beim kompilieren in 3.5, funktioniert es hier.
InformationsquelleAutor devoured elysium
Ist die
DataContext
gesetzt? Im code-behind, hast du den Wert für IhrTextBlock
"saadsas" (ich kann das nur vermuten), das brach Ihren databinding?InformationsquelleAutor Dave