从组合框中的另一个绑定调用方法

时间:2011-11-21 11:21:44

标签: c# wpf .net-4.0 combobox command

我有一个组合框,我想从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

5 个答案:

答案 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;
    }
}