我有ListView
从静态资源获取Style
。例如,我的ObservableCollection
中有MainWindowViewModel
个自定义对象。该对象包含一些属性,包括MyCustomObjectProperty
。 MainWindowViewModel
还有一个ICommand
,MyCommandOne
。
我的风格(为了简单起见,切掉一些部分):
<Window.Resources>
<Style x:Key="MyListViewStyle" TargetType="ListView">
<!--(Removed extra Setters)-->
<Setter Property="ItemTemplate">
<Setter.Value>
<DataTemplate>
<Button Command="{Binding Path=DataContext.MyCommandOne,
RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}"
CommandParameter="{Binding Path=MyCustomObjectProperty}">
<Button.Template>
<!--(Styling)-->
</Button.Template>
</Button>
</DataTemplate>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
创建ListView
:
<ListView Grid.Column="1"
Grid.Row="1"
ItemsSource="{Binding Path=MyObservableCollection}"
Style="{StaticResource MyListViewStyle}"
Margin="5"
BorderThickness="0"
Background="LightGray"
/>
此代码有效。当我单击ListView
中的按钮时,MyCommandOne
将使用由单击的列表视图项表示的自定义对象中的参数执行。
我的问题是:有没有办法用某种占位符替换DataContext.MyCommandOne, RelativeSource...
,所以我可以在实际ListView
的标记中指定所需的命令?这样,我可以使用此样式创建更多ListView
,但执行不同的命令。
答案 0 :(得分:1)
解决方法 - 将Tag
的{{1}}设置为实际命令,然后从ListView
绑定到Tag
的{{1}}属性。
ListView
和Button
:
<DataTemplate>
<Button Command="{Binding Tag, RelativeSource={RelativeSource FindAncestor,
AncestorType=ListView}}"/>
........
</DataTemplate>