2016-06-15 18 views
2

現在、私はYAML辞書を解析しているアプリケーションを持っています。私はこのようになりますLineという名前のモデルを持っている -UWP/XAMLの辞書の双方向データバインディング

public class Line 
    { 

     private ObservableDictionary<string, string> language = new ObservableDictionary<string, string>(); 

     public Line() 
     { 
      Language = new Dictionary<string, string>(); 
     } 

     // used with the YAML parser 
     [YamlMember(Alias = "language")] 
     public Dictionary<string, string> Language { get; set; } 

    } 

あなたはおそらく私が標準タイプではないObservableDictionaryを、使用していることに気付きました。私はこのコードをother StackOverflow answerから取った。私が理解しているように、それはただ必要なINotifyPropertyChangedインターフェイスを設定しているだけです。

とにかく、私のLineの場合は、ListViewには、言語の略語とテキストボックスで表される翻訳辞書が入っています。私が話していることをよりよく例示するために、ここにグラフィックがあります。私App.xaml

enter image description here

、私は定義された私のListViewのためのDataTemplateを持っている - 一緒に、彼らは次のようになります。それが正常に動作する必要がありますように

<ListView 
    ItemTemplate="{StaticResource LinesTemplateItem}" 
    ItemsSource="{Binding Value.Language}" 
    SelectionMode="None"> 
</ListView> 

... 

<DataTemplate x:Key="LinesTemplateItem"> 
    <StackPanel Background="Transparent"> 
     <TextBlock Text="{Binding Key}" /> 
     <TextBox Text="{Binding Value, Mode=TwoWay}" /> 
    </StackPanel> 
</DataTemplate> 

すべてがそうです。私のデータが正しく表示されます。私はいくつかの理由でデータバインディングは、内部のテキストの代わりに全体のUIコントロールをターゲットにしていることを推測する、エラーから

Error: Cannot save value from target back to source. 
BindingExpression: Path='Value' DataItem='Windows.Foundation.Collections.IKeyValuePair`2<String,String>'; 
target element is 'Windows.UI.Xaml.Controls.TextBox' (Name='null'); 
target property is 'Text' (type 'String'). 

:私は値を変更する場合しかし、それは誤りで基礎となるソースを更新しません。それの。私はしばらく検索してきましたが、このエラーを修正する方法を見つけることができません。どんな助けもありがとうございます。ありがとう。

答えて

2

プロパティIKeyValuePair.Valueは読み取り専用であるため、変更できません。私の提案は、データモデルを少し変更することです。つまり、最初に翻訳を保存するクラスを追加します。

public class Translation 
{ 
    public string Expression { get; set; } 
} 

今、あなたはまた、あなたの辞書などの定義を変更する必要がありますバインディング

public Dictionary<string, Translation> Language { get; set; } 

もそれに応じて更新する必要があります。それに

<TextBox Text="{Binding Value.Expression, Mode=TwoWay}" /> 

おかげで、あなたが値を変更した場合、データバインディングは読み取り専用ではないExpressionプロパティを更新します。

私はこのコードをテストしませんでしたが、私は過去に同様のことをしました。

1

Dictionary<string,string>にバインドしているので、各アイテムは値タイプのKeyValuePair<string,string>にバインドされています。フィールドは変更できません(アンボックス化されている間は変更できません)。パーツではなくペア自体にバインドし、値コンバーターを使用して値が変更されたペアを生成する必要があります。

関連する問題