在转换器中绑定ICommand

时间:2014-01-27 08:40:26

标签: wpf mvvm commandbinding

在我看来,我正在使用ItemsControl来显示几个按钮。 ItemsControl的XAML是:

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

在我的View的ViewModel中,我有一个可以处理Button-Click的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中的命令分配给创建按钮的Converter中的Command?

我试图将我的View的DataContext传递给Converter作为ConverterParameter,但是我得到了一个BindingException。

2 个答案:

答案 0 :(得分:1)

您可以通过ElementName Binding访问View的DataContext:

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

ConverterParameter必须是字符串,不能为数据绑定。

答案 1 :(得分:0)

我自己解决了。

我刚创建了一个singelton类,其中ViewModel的Command在构造函数中传递。在调用转换器的时刻,singelton已经有了Command,转换器可以分配命令。