【问题标题】:Binding from multiple sources从多个来源绑定
【发布时间】:2011-08-05 07:36:30
【问题描述】:

我的场景: 我有一个带有视图的 Silverlight 应用程序,我想将文本框绑定到一个对象(双向),并将所有标签绑定到保存标签翻译的字典。

我的方法是将页面的数据上下文设置为包含两个项目的字典,其中一个是对象,另一个是翻译字典。

在 xaml 中,代码如下所示:

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

这最初是有效的,但是如果我更改数据上下文中的对象,xaml 不会收到任何更改的通知并且不会更新。

我有一个使用转换器进行翻译的工作解决方案,但是由于一个转换器参数的限制,我不喜欢该解决方案。此外,无法在文本块中放置后备值,这会导致在设计页面时出现“不可见”的文本块。

关于如何解决此问题的任何建议?它不必使用我的字典,如果我可以将 datacontext 设置为对象(有效)并将标签以某种方式绑定,那也可以。

【问题讨论】:

    标签: silverlight xaml binding localization


    【解决方案1】:

    我知道这会得到很多传统答案,但我也想提出一些完全原创的东西,我们尝试(并成功)使用附加属性而不是绑定来更有效地本地化 Silverlight:

    Localisation of Silverlight projects after completion

    【讨论】:

      【解决方案2】:

      最灵活的做法是与其将视图的 DataContext 设置为字典,不如让 DataContext 类似于 ViewModel。也就是说,一个包含多个属性的简单类:一个用于“对象”,一个用于翻译字典。

      然后让充当 ViewModel 的类实现 INotifyPropertyChanged。 在您的类中创建一个名为 OnPropertyChanged 的​​方法,该方法接受一个表示您的属性名称的字符串。在该方法中引发传入 ViewModel 类实例的 PropertyChanged 事件和传入属性名称的新 PropertyChangedEventArgs。

      回到你在Set中创建的属性(对象和字典),设置值后,调用OnPropertyChanged,传入该属性的字符串名称。这将通知 UI 该属性的值已更改,并且实质上会将控件重新绑定到该属性。

      最后,将 View 上控件的 Text 属性绑定到您刚刚在 ViewModel 中创建的新属性。这应该确保视图上的控件保持最新。

      【讨论】:

      • 我想出了相同的解决方案,并在答案中编写了一些示例代码。由于 8 小时的限制,我无法发布答案,但无论如何感谢您的发布。
      【解决方案3】:

      我找到了解决方案,但无法回答我自己的问题(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()
        

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-03-29
        • 1970-01-01
        • 2011-02-07
        • 2015-09-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多