2011-08-05 52 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