Привязать ICommand в конвертере

На мой взгляд, я использую ItemsControl для отображения нескольких кнопок. XAML для ItemsControl:

<ItemsControl ItemsSource="{Binding CustomDirectories, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource buttonConverter}}" Margin="2">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <WrapPanel Orientation="Vertical"/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
</ItemsControl>

В ViewModel моего представления у меня есть ICommand, который может обрабатывать нажатие кнопки. Мне нужна команда здесь, потому что мне также нужны некоторые другие свойства здесь.

Конвертер для создания кнопок:

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
    if (value is ObservableCollection<DVDDirectory>)
    {
        ObservableCollection<CustomDirectory> customDirectories = (ObservableCollection<CustomDirectory>)value;
        List<Button> buttons = new List<Button>();

        foreach (CustomDirectory customDirectory in customDirectories)
        {
            Button button = new Button
            {
                Margin = new Thickness(2),
                Width = 140,
                Height = 25,
                Content = Path.GetFileName(customDirectory.Path)
            };
            buttons.Add(button);
        }
        return buttons;
    }
    return value;
}

Теперь мой вопрос: как я могу назначить команду из ViewModel для команды в конвертере, где создаются кнопки?

Я попытался передать DataContext моего представления в конвертер как ConverterParameter, но там я получаю исключение BindingException.


person Tomtom    schedule 27.01.2014    source источник
comment
преобразователи не для этого   -  person D J    schedule 27.01.2014


Ответы (2)


Вы можете получить доступ к DataContext вашего представления через привязку ElementName:

<ItemsControl Name="MyItemsControl">
    <ItemsControl.ItemTemplate>
        <DataTemplate>                    
            <Button Command="{Binding ElementName=MyItemsControl, Path=DataContext.MyCommand}" CommandParameter="{Binding}"></Button>                    
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

ConverterParameter должен быть строкой и не может быть привязан к данным.

person Gerrit Fölster    schedule 27.01.2014
comment
Это решение работает, если у меня есть только одна кнопка. Но в моем случае кнопки создаются во время выполнения - person Tomtom; 27.01.2014
comment
Приятно слышать, может быть, вы хотите отредактировать исходный пост и поделиться своим решением. - person Gerrit Fölster; 27.01.2014

Я решил это самостоятельно.

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

person Tomtom    schedule 27.01.2014
comment
Но на самом деле вы должны использовать шаблон данных для этого. В шаблоне данных должна быть кнопка, привязанная к viewmodel.command. - person D J; 27.01.2014