blu*_*bit 5 wpf mvvm multibinding
对于我的生活,我似乎无法使用multibindings绑定到我的viewmodel.net上的所有示例都直接绑定到gui元素,但每当我尝试使用viewmodel对象时,都会抛出异常.
我的问题是,如何在xaml中为多个viewmodel对象添加多绑定?
我需要将上下文菜单的IsEnabled属性绑定到我的viewmodel中的两个整数.以下绑定不起作用,因为它是为GUI组件设计的.如何使用我的整数?
<MenuItem ItemsSource="{Binding MyMenuItem}">
<MenuItem.IsEnabled>
<MultiBinding>
<Binding ElementName="FirstInt" Path="Value" />
<Binding ElementName="SecondInt" Path="Value" />
</MultiBinding>
</MenuItem.IsEnabled>
</MenuItem>
Run Code Online (Sandbox Code Playgroud)
MyMenuItem是CLR对象,带有两个整数FirstInt和SecondInt.
小智 18
菲利普的答案是可以接受的,但对于任何寻找菲利普所需解决方案的人来说,以下都应该这样做:
<MenuItem ItemsSource="{Binding MyMenuItem}">
<MenuItem.IsEnabled>
<MultiBinding Converter="{StaticResource IntsToEnabledConverter}">
<Binding RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType=Window}" Path="DataContext.FirstInt" />
<Binding RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType=Window}" Path="DataContext.SecondInt" />
</MultiBinding>
</MenuItem.IsEnabled>
</MenuItem>
Run Code Online (Sandbox Code Playgroud)
应该注意,AncestorType可能需要相应地改变绑定.我假设视图模型被设置为DataContext窗口,但同样的想法适用于用户控件等.
对于您的特定示例,您需要一个 IMultiValueConverter 它将两个整数转换为表示菜单项是否启用的布尔值。像这样的东西:
Public Class MVCIntsToEnabled
Implements IMultiValueConverter
Public Function Convert(ByVal values() As Object, ByVal targetType As System.Type, ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IMultiValueConverter.Convert
If values IsNot Nothing Then
If values.Count = 2 Then
Return (values(0) > 0) AndAlso (values(1) > 0)
Else
Return False
End If
Else
Throw New ArgumentNullException("values")
End If
End Function
Public Function ConvertBack(ByVal value As Object, ByVal targetTypes() As System.Type, ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object() Implements System.Windows.Data.IMultiValueConverter.ConvertBack
Throw New NotImplementedException()
End Function
End Class
Run Code Online (Sandbox Code Playgroud)
像这样使用:
<local:MVCIntsToEnabled x:Key="IntsToEnabledConverter" />
...
<MenuItem ItemsSource="{Binding MyMenuItem}">
<MenuItem.IsEnabled>
<MultiBinding Converter="{StaticResource IntsToEnabledConverter}">
<Binding ElementName="FirstInt" Path="Value" />
<Binding ElementName="SecondInt" Path="Value" />
</MultiBinding>
</MenuItem.IsEnabled>
</MenuItem>
Run Code Online (Sandbox Code Playgroud)