2014-01-27 2 views
2

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

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

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

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

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.

+0

преобразователи не предназначены для этой цели –

ответ

0

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

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

+1

Но на самом деле вы должны использовать шаблон данных для этого. На панели данных должна быть кнопка, привязанная к viewmodel.command. –

1

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

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

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

+0

Это решение работает, если у меня есть только одна кнопка. Но в моем случае кнопки создаются во время выполнения – Tomtom

+0

Я только что нашел способ решить свою проблему. – Tomtom

+0

Приятно слышать, может быть, вы хотите отредактировать свой оригинальный пост и поделиться своим решением. –