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

本文关键字:绑定 调用 方法 另一个 组合 | 更新日期: 2023-09-27 18:15:21

我有一个组合框,我想从MainViewModel调用一个方法,但它绑定到employeesoverviewmodel。这可能吗?如果是,怎么做?

这是我的代码为combobox
<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>

我想过使用命令,但我无法解决绑定问题。

BR

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

如果你的MainViewModel在任何地方都是可视树作为DataContext,那么你可以在ComboBox的CommandBinding中使用RelativeSource实现你想要的。

在我对原始帖子的评论中展开。下面是一个如何绑定到父元素的数据上下文的示例。

Command="{Binding RelativeSource={RelativeSource FindAncestor,
    AncestorType={x:Type Window}}, Path=DataContext.SomeCommand}"

设置要绑定到的视图模型上的命令路径

两个ViewModels彼此认识吗?然后,EmployeesOverviewViewModel可以提供您将执行的委托,MainWindowViewModel可以使用该委托将其"绑定"到其方法。(编辑:如果MainWindowViewModel知道EmployeesOverviewViewModel就足够了)

否则,您可以尝试使用FindAncestor绑定并尝试获得MainWindowView。问题是,你不仅需要视图本身,还需要它的DataContext .

我认为你有两种现实的方法。

1)如果你的视图可以看到MainViewModel的一个合适的实例,你应该能够绑定到命令或任何你需要通过使用StaticResource或DynamicResource。我看到你正在使用一个StaticResource来查找视图模型提供的组合框的项目,会有类似的工作寻找MainViewModel吗?

2)如果你的视图不能看到MainViewModel,但你的视图模型可以,让视图模型暴露一个合适的命令或方法,只是有调用MainViewModel的版本。这样更简洁,因为你的EmployeesOverviewView根本不需要知道任何关于MainViewModel的信息。

我更喜欢选项2

您可以使用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;
    }
}