我有一个组合框,我想从MainViewModel调用一个方法,但它绑定到EmployeesOverviewViewModel。是否有可能做到这一点?如果是的话 - 怎么样?
<ComboBox ScrollViewer.CanContentScroll="False" Text="Select Employees" DataContext="{Binding EmployeesOverviewViewModel, Source={StaticResource ViewModelLocator}}" Name="employeeComboBox" ItemsSource="{Binding Employees}">
<ComboBox.ItemTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding Path=IsSelected}" Content="{Binding Path=Name}" Width="{Binding ElementName=employeeComboBox, Path=ActualWidth}" VerticalAlignment="Center">
</CheckBox>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
我考虑过使用Command但我无法弄清楚绑定问题。
BR
答案 0 :(得分:1)
如果你的MainViewModel在任何地方都是可视树作为DataContext,那么你可以在CommandBinding中为你的ComboBox实现你想要的RelativeSource。
答案 1 :(得分:1)
扩展我对原帖的评论。下面显示的是如何绑定到父级的数据上下文的示例。
Command="{Binding RelativeSource={RelativeSource FindAncestor,
AncestorType={x:Type Window}}, Path=DataContext.SomeCommand}"
在要绑定的viewmodel上设置命令路径。
答案 2 :(得分:0)
两个ViewModel是否相互认识?然后EmployeesOverviewViewModel
可以提供您将执行的委托,MainWindowViewModel
可以使用此委托将其“绑定”到其方法。 (编辑:如果MainWindowViewModel
知道EmployeesOverviewViewModel
)
否则,您可以尝试使用FindAncestor
绑定并尝试获取MainWindowView
。那么问题是你不仅需要视图本身,而且需要DataContext
。
答案 3 :(得分:0)
我想说你有两种现实的方法。
1)如果您的视图可以看到合适的MainViewModel实例,您应该能够通过使用StaticResource或DynamicResource绑定到命令或其中所需的任何内容。我看到你正在使用StaticResource来查找提供ComboBox项目的viewmodel,是否有类似的工作来查找MainViewModel?
2)如果你的视图看不到MainViewModel,但你的viewmodel可以,让viewmodel公开一个合适的命令或方法,只需要调用MainViewModel的版本。这更干净,因为您的EmployeesOverviewView根本不需要了解MainViewModel。
我更喜欢选项2。
答案 4 :(得分:0)
您可以使用MultiValueConverter执行此操作。我给你看一个小样本。
我有一个带有3个CheckBox的窗口:
<Window x:Class="WpfApplication7.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow"
Height="300" Width="400" mc:Ignorable="d"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:WpfApplication7="clr-namespace:WpfApplication7" d:DesignHeight="371"
d:DesignWidth="578" SizeToContent="WidthAndHeight">
<Window.Resources>
<WpfApplication7:MultiBooleanConverter x:Key="multiBooleanConverter" />
</Window.Resources> <Grid>
<CheckBox Content="Hallo">
<CheckBox.IsChecked>
<MultiBinding Converter="{StaticResource ResourceKey=multiBooleanConverter}">
<Binding ElementName="checkBox1" Path="IsChecked"/>
<Binding ElementName="checkBox2" Path="IsChecked"/>
</MultiBinding>
</CheckBox.IsChecked>
</CheckBox>
<CheckBox x:Name="checkBox1" Content="CheckBox" Height="16" HorizontalAlignment="Left" Margin="64,72,0,0" VerticalAlignment="Top" />
<CheckBox Content="CheckBox" Height="16" HorizontalAlignment="Left" Margin="62,120,0,0" x:Name="checkBox2" VerticalAlignment="Top" />
</Grid>
</Window>
MultiValueConverter的声明如下:
public class MultiBooleanConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
return values.Cast<bool>().Any(b => b);
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
object[] returnValue = new object[targetTypes.Length];
for (int i = 0; i < targetTypes.Length; i++)
{
returnValue[i] = (bool)value;
}
return returnValue;
}
}