";占位符“;正在StaticResource中绑定

本文关键字:StaticResource 正在 绑定 quot 占位符 | 更新日期: 2023-09-27 18:25:25

我有一个ListView,它从静态资源中获取其Style。例如,我的MainWindowViewModel中有一个自定义对象的ObservableCollection。此对象包含一些属性,包括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,但执行不同的命令。

";占位符“;正在StaticResource中绑定

Workaround-将ListViewTag设置为实际命令,然后从Button绑定到ListViewTag属性。

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

ListView:中

<ListView Tag="{Binding MyCommandOne}"/>