“占位符”绑定在StaticResource中

时间:2014-10-01 17:37:45

标签: c# wpf

我有ListView从静态资源获取Style。例如,我的ObservableCollection中有MainWindowViewModel个自定义对象。该对象包含一些属性,包括MyCustomObjectPropertyMainWindowViewModel还有一个ICommandMyCommandOne

我的风格(为了简单起见,切掉一些部分):

<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,但执行不同的命令。

1 个答案:

答案 0 :(得分:1)

解决方法 - 将Tag的{​​{1}}设置为实际命令,然后从ListView绑定到Tag的{​​{1}}属性。

ListView

Button

<DataTemplate>
   <Button Command="{Binding Tag, RelativeSource={RelativeSource FindAncestor,
                                  AncestorType=ListView}}"/>
    ........
</DataTemplate>