小编Chr*_*oll的帖子

WPF:从ControlTemplate绑定到命令

我正在尝试向自定义ListView(MyListView)添加一个按钮,该按钮触发MyListView中定义的命令(MyCustomCommand).我通过应用ControlTemplate添加了按钮(和标题文本).问题是我没有找到一种方法来点击按钮时触发MyCustomCommand.我最终想要实现的是打开一个Popup或ContextMenu,我可以在其中选择哪些列应该在ListView中可见.

这是我的模板来源:

<Style TargetType="local:MyListView">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="local:MyListView">
                <Border Name="Border" BorderThickness="1" BorderBrush="Black">
                    <Grid>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="30" />
                            <RowDefinition />
                        </Grid.RowDefinitions>

                        <Grid Background="LightSteelBlue">
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition />
                                <ColumnDefinition Width="Auto" />
                            </Grid.ColumnDefinitions>
                            <TextBlock Margin="3,3,3,3" Text="{TemplateBinding HeaderTitle}" Grid.Column="0" VerticalAlignment="Center" HorizontalAlignment="Stretch" FontSize="16" />
                            <Button Margin="3,3,3,3" Grid.Column="1" 
                                    VerticalAlignment="Center" HorizontalAlignment="Right" Height="20"
                                    Command="{TemplateBinding MyCustomCommand}">A button</Button>
                        </Grid>

                        <ScrollViewer Grid.Row="1" Style="{DynamicResource {x:Static GridView.GridViewScrollViewerStyleKey}}">
                            <ItemsPresenter />
                        </ScrollViewer>
                    </Grid>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
Run Code Online (Sandbox Code Playgroud)

以下是MyListView的定义:

public class MyListView : ListView
{
    public static readonly DependencyProperty MyCustomCommandProperty = 
        DependencyProperty.Register("MyCustomCommand", typeof(ICommand), typeof(MyListView));

    private …
Run Code Online (Sandbox Code Playgroud)

wpf binding command controltemplate

7
推荐指数
2
解决办法
1万
查看次数

从ListView样式中设置GridViewColumnHeader样式

在我的一个项目中,我继承了ListView并通过设置新的控件模板来覆盖样式.我还重写了列标题样式.到目前为止,我已经找到了两种方法:

1)通过设置样式键并引用GridView中的样式:

<Style TargetType="{x:Type GridViewColumnHeader}" x:Key="MyHeaderStyle">
    <Setter Property="Background" Value="Wheat" />
</Style>

<GridView ColumnHeaderContainerStyle="{StaticResource MyHeaderStyle}">
Run Code Online (Sandbox Code Playgroud)

2)不为上述样式设置样式键.现在我不需要在GridView中引用样式,但它也会覆盖我的应用程序中的所有listview头,而不依赖于listview类型.

由于我在我的应用程序中使用了很多列表视图,因此我希望以第三种更灵活的方式实现这一点; 通过在ListView样式中设置GridView.ColumnHeaderContainerStyle.这样我就不需要在每个GridView中引用标题样式.这是目前为止XAML的简化版本:

<Window.Resources>
    <Style TargetType="{x:Type GridViewColumnHeader}" x:Key="MyHeaderStyle">
        <Setter Property="Background" Value="Wheat" />
    </Style>

    <Style TargetType="{x:Type list:MyListView}">
        <Setter Property="GridView.ColumnHeaderContainerStyle" Value="{StaticResource MyHeaderStyle}" />            
        <Setter Property="Background" Value="Linen" />                                   
    </Style>
</Window.Resources>

<list:MyListView>
    <list:MyListView.View>
        <GridView>
            <GridViewColumn Header="Column1" />
            <GridViewColumn Header="Column2" />
        </GridView>
    </list:MyListView.View>
</list:MyListView>
Run Code Online (Sandbox Code Playgroud)

遗憾的是,这并未设置标题样式...如果我对上面的XAML进行了此更改,则可以:

<GridView ColumnHeaderContainerStyle="{StaticResource MyHeaderStyle}">
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

wpf listview gridview columnheader

6
推荐指数
1
解决办法
2万
查看次数