在我看来,我正在使用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。
答案 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,转换器可以分配命令。