Вызов метода из другой привязки в выпадающем списке - PullRequest
0 голосов
/ 21 ноября 2011

У меня есть выпадающий список, который я хочу вызвать методом из 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 ]

1 голос
/ 21 ноября 2011

В расширении моего комментария к оригинальному сообщению.Ниже показан пример привязки к контексту данных родительского элемента.

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

Укажите путь к команде на модели представления, с которой вы хотите связать.

1 голос
/ 21 ноября 2011

если ваша MainViewModel где-нибудь является визуальным деревом как DataContext, тогда вы можете достичь того, что вы хотите, с RelativeSource в CommandBinding для вашего ComboBox.

0 голосов
/ 21 ноября 2011

Вы можете сделать это, используя 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;
    }
}
0 голосов
/ 21 ноября 2011

Я бы сказал, что у вас есть два реалистичных подхода.

1) если ваше представление может видеть подходящий экземпляр MainViewModel, вы должны иметь возможность привязать команду или все, что вам нужно для этого, используя StaticResource илиDynamicResource.Я вижу, что вы используете StaticResource для поиска модели представления, предоставляющей элементы ComboBox, сработает ли что-то подобное для поиска MainViewModel?

2), если ваше представление не может видеть MainViewModel, но ваша модель представления может получитьviewmodel для выставления подходящей команды или метода и просто вызов версии MainViewModel.Это чище, так как тогда ваш EmployeesOverviewView вообще ничего не должен знать о MainViewModel.

Я бы предпочел вариант 2.

0 голосов
/ 21 ноября 2011

Обе модели ViewModel знают друг друга?Тогда EmployeesOverviewViewModel может предоставить делегат, который вы будете выполнять, а MainWindowViewModel может использовать этот делегат, чтобы "привязать" его к своему методу.(редактировать: было бы достаточно, если MainWindowViewModel знает EmployeesOverviewViewModel)

В противном случае вы можете попытаться использовать привязку, используя FindAncestor и попытаться получить MainWindowView.Тогда проблема будет в том, что вам нужен не просто сам вид, а его DataContext.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...