2013-08-09 1 views
7

Ich versuche, eine WPF-Textbox an ein Wörterbuch in einem Ansichtsmodell zu binden. Das Viewmodel wird als Datenkontext für die View verwendet. Ich fand viele Beispiele und es klingt einfach, aber es wird nicht für mich funktionieren.WPF-Bindungstextbox zum Wörterbucheintrag

Ausblick:

TextBox x: Name = "txbTest" Grid.Row = "10" Grid.Column = "2" Text = "{Binding MyDict [Erste]}"

Ansichtsmodell:

public Dictionary<string, string> MyDict = new Dictionary<string, string> 
     { 
      {"First", "Test1"}, 
      {"Second", "Test2"} 
     }; 

ich versuche, alle Varianten gefunden i

Text="{Binding MyDict[First]}" 
Text="{Binding Path=MyDict[First]}" 
Text="{Binding MyDict[First].Text}" 
Text="{Binding MyDict[First].Value}" 

Aber nichts funktioniert, Textfeld ist leer. Irgendeine Idee?

+0

Sie können nicht an ein Feld binden. Definieren Sie 'MyDict' als Eigenschaft. Ich habe den Beispielcode in meiner Antwort geteilt. –

+1

Offensichtlich kann es so einfach sein. Danke, es funktioniert. Ich wurde durch einige Beispiele geführt. – user2377283

Antwort

18

In Ihrem Code ist ein Binding-Fehler enthalten, da MyDict keine Eigenschaft ist. Sie müssen eine Property binden und nicht an ein Field

System.Windows.Data Error: 40 : BindingExpression path error: 'MyDict' property not found on 'object' ''MainWindow' (Name='')'. BindingExpression:Path=MyDict[First]; DataItem='MainWindow' (Name=''); target element is 'TextBox' (Name='textBox1'); target property is 'Text' (type 'String') 

Ändern der MyDict Field zu einem Property wie unten

gezeigt
private Dictionary<string, string> _MyDict; 

    public Dictionary<string, string> MyDict 
    { 
     get { return _MyDict; } 
     set { _MyDict = value; } 
    } 

im Konstruktor Ihrer ViewModel MyDict initialisieren.

 MyDict = new Dictionary<string, string> 
     { 
      {"First", "Test1"}, 
      {"Second", "Test2"} 
     }; 

Die folgenden beiden Varianten werden nicht funktionieren, wie MyDict [ „key“] ein string und string gibt keine Text oder Value Eigenschaft. Die anderen beiden Varianten sollten funktionieren.

Text="{Binding MyDict[First].Text}" 
Text="{Binding MyDict[First].Value}" 
+1

Offensichtlich kann es so einfach sein. Danke, es funktioniert. Ich wurde durch einige Beispiele geführt. – user2377283

+0

Ihre Begrüßung !. Akzeptieren Sie die Antwort, wenn Sie es nützlich fanden. –

+0

Wie würdest du das programmatisch machen? Sagen wir, ich erstelle dynamisch die Textbox und das Wörterbuch. – estebro