按钮不会从样式中触发

时间:2014-04-07 08:41:59

标签: c# wpf xaml

是的,我不确定我做了什么。大脑感觉像瑞士奶酪

<Window.Resources>
        <Style TargetType="{x:Type Button}">
            <Setter Property="Focusable" Value="False"/>
            <Setter Property="Background" Value="Transparent"/>
            <Setter Property="Command" Value="{Binding CommandButtonClicked}"/>
            <Setter Property="CommandParameter"  Value="{Binding Mode=OneWay, RelativeSource={RelativeSource Self}}"/>
        </Style>
    </Window.Resources>

将触发的按钮。

            <Grid DockPanel.Dock="Top">
                <TextBox BorderBrush="Transparent" BorderThickness="0" x:Name="txtInput" Padding="50,10,15,15" AcceptsReturn="True" TextChanged="txtInput_TextChanged" TextWrapping="Wrap" Foreground="Crimson" Text="{Binding UserInput, Mode=TwoWay}" Background="Transparent"/>
                <Button Width="30" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="10,3,0,0">
                    <Image Source="Images/Actions list add user.ico" />
                </Button>
            </Grid>

不会触发的按钮

<ListView x:Name="ListViewUsers" ItemsSource="{Binding UserNames}" DockPanel.Dock="Top" Foreground="Green" BorderBrush="Transparent">
                <ListView.View>
                    <GridView>
                        <GridViewColumn>
                            <GridViewColumn.HeaderTemplate>
                                <DataTemplate>
                                    <Button Margin="3,0,3,0" Width="30">
                                        <Image Source="Images/Actions user group delete.ico"/>
                                    </Button>
                                </DataTemplate>
                            </GridViewColumn.HeaderTemplate>
                            <GridViewColumn.CellTemplate>
                                <DataTemplate>
                                    <Button>
                                        <Image Source="Images/Actions list remove user.ico" Width="25"/>
                                    </Button>
                                </DataTemplate>
                            </GridViewColumn.CellTemplate>
                        </GridViewColumn>
                        <GridViewColumn Header="User ID" DisplayMemberBinding="{Binding}"/>
                    </GridView>
                </ListView.View>
            </ListView>

我也试过在每个按钮上添加一个单独的DelegateCommand,但这也没有帮助。它似乎是这个ListView中的任何内容,并且在初始渲染不会触发后在运行时生成。

任何想法?

1 个答案:

答案 0 :(得分:1)

在“单元格”DataTemplate中,它会将DataContext设置为分配给ListView的数据集合中的“item”,为其提供“外观”即ie一个“用户名”。

但你的风格是使用一个需要访问包含“CommandButtonClicked”属性的对象的绑定。

因此,您需要一种方法来回到持有“CommandButtonClicked”属性的DataContext .....所以假设您已将“ViewModel”设置到Windows DataContext上,您可以这样做......

   <ListView x:Name="ListViewUsers" ItemsSource="{Binding UserNames}" DockPanel.Dock="Top" Foreground="Green" BorderBrush="Transparent">
                    <ListView.View>
                        <GridView>
                            <GridViewColumn>
                                <GridViewColumn.HeaderTemplate>
                                    <DataTemplate>
                                        <Button Margin="3,0,3,0" Width="30" DataContext="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}},Path=DataContext}">
                                            <Image Source="Images/Actions user group delete.ico"/>
                                        </Button>
                                    </DataTemplate>
                                </GridViewColumn.HeaderTemplate>
                                <GridViewColumn.CellTemplate>
                                    <DataTemplate>
                                        <Button DataContext="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}},Path=DataContext}">
                                            <Image Source="Images/Actions list remove user.ico" Width="25"/>
                                        </Button>
                                    </DataTemplate>
                                </GridViewColumn.CellTemplate>
                            </GridViewColumn>
                            <GridViewColumn Header="User ID" DisplayMemberBinding="{Binding}"/>
                        </GridView>
                    </ListView.View>
                </ListView>

还有其他方法可以做你正在做的事情......只有一个建议......查找路由命令(你可以定义一个,然后在你的风格中使用它,例如Command="{x:Static mynamespace::MyCommands.DoSomething}",然后设置一个{ {1}}处理它们)。