(WPF)如何使用每行中的按钮更改listBox中的按钮图像背景?

时间:2013-08-14 09:48:56

标签: c# wpf listbox datatemplate

我有列表框,数据模板是按钮:

 <ListBox  x:Name="lbname" ItemsSource="{Binding myCollection}">        
        <ListBox.ItemTemplate>
            <DataTemplate>
                <Button x:Name="btnname" Content="{Binding name}" Click="btnname_Click">
                    <Button.Background>
                        <ImageBrush ImageSource="/myApplication;component/images/buttons/normal.png"/>
                    </Button.Background>
                </Button>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

我有这个listBox图像的两个图像背景(普通模式的normal.png,listBox中所选项目的click.png)

按钮列表中的listBox视图项,按钮图像背景通常是normal.png

我的问题是如何将按钮图像背景更改为click.png选定的一个,旧的选定按钮检索到normal.png

如何使用每行中的按钮更改listBox中所选项目的图像背景?

希望这清楚,请大约花一天时间来解决这个问题 任何人都可以提供帮助

谢谢

3 个答案:

答案 0 :(得分:1)

我还没有测试过,但你需要一些看起来像这样的代码:

<ListBox x:Name="lbname" ItemsSource="{Binding myCollection}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Button x:Name="btnname" Click="btnname_Click">
                <Grid>
                    <Image>
                        <Image.Style>
                            <Style>
                                <Setter Property="Image.Source" 
Value="/myApplication;component/images/buttons/normal.png" />
                                <Style.Triggers>
                                    <DataTrigger Binding="{Binding IsSelected, 
RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBoxItem}}}" 
Value="True">
                                        <Setter Property="Image.Source" 
Value="/myApplication;component/images/buttons/click.png" />
                                    </DataTrigger>
                                </Style.Triggers>
                            </Style>
                        </Image.Style>
                    </Image>
                    <TextBlock Text="{Binding name}" HorizontalAlignment="Center" 
VerticalAlignment="Center" />
                </Grid>
            </Button>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

我们的想法是直接绑定到IsSelected对象的ListBoxItem属性。这是使用RelativeSource绑定完成的。但是,我猜这个代码没有做你想要的...我建议你可能想要使用ToggleButton而不是......这样的事情:

<ListBox x:Name="lbname" ItemsSource="{Binding myCollection}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <ToggleButton x:Name="btnname" Click="btnname_Click" IsChecked="{Binding 
IsSelected, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type 
ListBoxItem}}}">
                <Grid>
                    <Image>
                        <Image.Style>
                            <Style>
                                <Setter Property="Image.Source" 
Value="/myApplication;component/images/buttons/normal.png" />
                                <Style.Triggers>
                                    <DataTrigger Binding="{Binding IsSelected, 
RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBoxItem}}}" 
Value="True">
                                        <Setter Property="Image.Source" 
Value="/myApplication;component/images/buttons/click.png" />
                                    </DataTrigger>
                                </Style.Triggers>
                            </Style>
                        </Image.Style>
                    </Image>
                    <TextBlock Text="{Binding name}" HorizontalAlignment="Center" 
VerticalAlignment="Center" />
                </Grid>
            </ToggleButton>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

答案 1 :(得分:0)

如果您正在使用MVVM,那么在viewModel中创建一个属性并将其作为ImageSource绑定到ImageBrush, 当您在ListView中选择值时,然后获取所选记录并更改此属性的图像路径。

答案 2 :(得分:0)

尝试使用Togglebutton而不是button。使用触发器检查toggleButton的IsChecked属性何时更改。并基于此改变你的形象。