2011-08-05 82 views
0

我的場景: 我有一個帶有視圖的Silverlight應用程序,其中我想將文本框綁定到對象(雙向),並將所有標籤綁定到持有標籤翻譯的字典。來自多個來源的綁定

我的方法是將頁面的datacontext設置爲包含兩個項目的字典,其中一個是對象,另一個是翻譯字典。

在XAML代碼如下所示:

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

這工作一開始,如果我然而改變DataContext的對象時,XAML是不通知任何變化和不更新。

我已經有一個工作解決方案使用轉換器進行翻譯,但由於一個轉換器參數的限制,我不喜歡該解決方案。另外,無法在文本塊中放置回退值,導致設計頁面時出現「不可見」文本塊。

有關如何解決此問題的任何建議?它不必使用我的字典,如果我可以將datacontext設置爲對象(它工作)並將標籤綁定到某種不同的方式,那也可以。

回答

1

我發現了一個解決方案,但無法回答我自己的問題(8小時..) 我認爲這只是Hydroslide建議的方法。


  1. 創建持有的所有數據,並實現INotifyPropertyChanged

    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. 在你的頁面代碼

    Private mycontext As New MyDatacontext 
    
  3. 定義的私人變種在你的頁面的構造函數的類,用你想要的數據填寫你的「mycontext」

    mycontext.Dict = LoadDictionary() 
    mycontext.Obj = LoadObject() 
    Me.DataContext = mycontext 
    
  4. 更改您的XAML以下

    <TextBlock Text="{Binding Dict.[name],FallbackValue=MyFallback}" /> 
    <TextBox Text="{Binding Obj.name,Mode=TwoWay}" /> 
    
  5. 更新你的對象/字典作爲你喜歡用

    mycontext.Obj = LoadNextObject() 
    
1

最靈活的是什麼而不是將視圖的DataContext設置爲字典,您最好是將DataContext設置爲ViewModel。也就是說,一個簡單的類擁有多個屬性:一個用於「對象」,另一個用於翻譯詞典。

然後有充當您的ViewModel實現INotifyPropertyChanged的類。 在您的類中創建一個名爲OnPropertyChanged的方法,該方法接受一個表示屬性名稱的字符串。在該方法中,引發ViewModel類實例中傳遞的PropertyChanged事件和傳遞屬性名稱中的新PropertyChangedEventArgs。

回到Set中創建的屬性(對象和字典)中,在設置值之後,調用OnPropertyChanged傳入該屬性的字符串名稱。這將通知UI該屬性的值已經改變,並且基本上將該控件重新綁定到該屬性。

最後,將視圖上控件的Text屬性綁定到您在ViewModel中創建的新屬性。這應確保視圖上的控件始終處於最新狀態。

+0

,我想出了相同的解決方案,並有在答案中寫了一些示例代碼。由於8小時限制,我無法發佈答案,不過感謝你的帖子。 – Webfarmer