从组合框中的另一个绑定调用方法
本文关键字:绑定 调用 方法 另一个 组合 | 更新日期: 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;
}
}