2011-08-05 7 views
0

私のシナリオ: テキストボックスをオブジェクト(双方向)にバインドし、すべてのラベルをラベル翻訳を保持する辞書にバインドする、ビュー付きのSilverlightアプリケーションがあります。複数のソースからのバインド

私のアプローチは、ページのデータコンテキストを2つの項目を持つ辞書に設定することでした。その1つはオブジェクトであり、もう1つは翻訳辞書です。

は、XAMLでのコードは次のようになります。これは私がしかし、DataContextの上のオブジェクトを変更した場合、最初に、XAMLは、すべての変更について通知されていない作品と更新されません

<TextBlock Text="{Binding [dict].[name],FallbackValue='Fallback'}" /> 
<TextBox Text="{Binding [obj].name,Mode=TwoWay}" /> 

変換のためにConverterを使用していた実用的な解決策がありましたが、1つのコンバータパラメータの制限により、私は解決策が気に入らなかった。さらに、テキストブロックにフォールバック値を配置することはできませんでした。その結果、ページをデザインする際に「見えない」テキストブロックが発生しました。

この問題の解決方法に関するご提案はありますか?それは私の辞書を使用している必要はありません、それは(操作)オブジェクトにdatacontextを設定し、何とか別のラベルをバインドすることができますも大丈夫です。

答えて

1

私は解決策を見つけましたが、自分の質問に答えることができませんでした。(8時間制限です) これは単にHydroslideが提案した手法だと思います。


  1. ページのコンストラクタで

    Public Class MyDatacontext 
        Implements ComponentModel.INotifyPropertyChanged 
    
    'Properties 
    Private _obj As Object 
    Private _dict As Dictionary(Of String, String) 
    
    'Events 
    Public Event PropertyChanged(ByVal sender As Object, ByVal e As System.ComponentModel.PropertyChangedEventArgs) Implements System.ComponentModel.INotifyPropertyChanged.PropertyChanged 
    
    'Methods 
    Public Property Obj As Object 
        Get 
        Return _obj 
        End Get 
        Set(ByVal value As Object) 
        _obj = value 
        'Notify the xaml about the changed Object 
        RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs("Obj")) 
        End Set 
    End Property 
    
    Public Property Dict As Dictionary(Of String, String) 
        Get 
        Return _dict 
        End Get 
        Set(ByVal value As Dictionary(Of String, String)) 
        _dict = value 
        'Notify the xaml about the changed translation 
        RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs("Dict")) 
        End Set 
    End Property 
    End Class 
    
  2. あなたのページのコードでプライベートVARを定義

    Private mycontext As New MyDatacontext 
    
  3. をINotifyPropertyChangedのすべてのデータと道具を保持するクラスを作成します。 、 "mycontext"に目的のデータを入力してください

    mycontext.Dict = LoadDictionary() 
    mycontext.Obj = LoadObject() 
    Me.DataContext = mycontext 
    
  4. 変更は

    mycontext.Obj = LoadNextObject() 
    
1

私は、これは伝統的な答えの多くを得ることを知っているが、私はまた、添付プロパティを使用する代わりに結合前方我々が試した(そして成功した)完全にオリジナルな何かのSilverlightのより効率的なローカライズのために自分自身をやってを入れたいと思います:

Localisation of Silverlight projects after completion

1

ビューのDataContextを辞書に設定するのではなく、DataContextをViewModelのようにする方がよいでしょう。つまり、複数のプロパティを保持する単純なクラスです.1つは「オブジェクト」用で、もう1つは翻訳辞書用です。

次に、ViewModelとして機能するクラスにINotifyPropertyChangedを実装します。 OnPropertyChangedという名前のクラス内に、プロパティ名を表す文字列を取り込むメソッドを作成します。このメソッドでは、ViewModelクラスのインスタンスで渡されるPropertyChangedイベントと、プロパティ名で渡される新しいPropertyChangedEventArgsを発生させます。

値を設定した後で、作成したプロパティ(オブジェクトと辞書)に戻って、OnPropertyChangedを呼び出して、そのプロパティの文字列名を渡します。これは、このプロパティの値が変更されたことをUIに通知し、本質的にコントロールをそのプロパティに再バインドします。

最後に、ビューのコントロールのTextプロパティをViewModelで作成したばかりの新しいプロパティにバインドします。これにより、ビューのコントロールが最新の状態に維持されるようにする必要があります。

+0

を使用してのように、次の

<TextBlock Text="{Binding Dict.[name],FallbackValue=MyFallback}" /> <TextBox Text="{Binding Obj.name,Mode=TwoWay}" /> 
  • 更新あなたとあなたのオブジェクト/辞書へあなたのXAMLは、私は同じ解決策を考え出したと持ってきました答えにいくつかのサンプルコードを書いています。私は8時間の制限のために答えを投稿できませんでしたが、とにかくあなたの投稿に感謝します。 – Webfarmer

  • 関連する問題