none
对象用DataTemplate呈现出黑色边框,在ListBox里,被选中时如何呈现蓝色边框? RRS feed

  • 问题

  • 我有一个类Card,里面只有一个属性Name。

    App.xaml有它的模板:

            <DataTemplate DataType="{x:Type WpfApplication1:Card}">
                <Border BorderBrush="Black" BorderThickness="5">
                    <TextBlock Text="{Binding Name}" />
                </Border>
            </DataTemplate>

    窗口的XAML:

    <Window x:Class="WpfApplication1.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="MainWindow" Height="350" Width="525">
        <StackPanel>
            <Button Content="填充" Click="Button_Click_1"/>
            <ContentControl Name="contentControl" />
            <ListBox Name="listBox">
                <ListBox.ItemContainerStyle>
                    <Style TargetType="ListBoxItem">
                        <Setter Property="Background" Value="Transparent"/>
                        <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate TargetType="{x:Type ListBoxItem}">
                                    <ContentPresenter/>
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </Style>
                </ListBox.ItemContainerStyle>
            </ListBox>
        </StackPanel>
    </Window>

    我设置了ItemContainerStyle,是因为我不要默认的蓝色底表示选中,我只想要用蓝色边框表示选中。而且,我在app.xaml里设置边框为5个单位,我不想让它变粗。

    Button_Click事件里只是填充了contentControl和ListBox:

                Card c1 = new Card { Name = "过河拆桥" };
                Card c2 = new Card { Name = "万箭齐发" };
                contentControl.Content = c1;
    
                listBox.Items.Add(c1);
                listBox.Items.Add(c2);

    所以请问要怎么改一下,才能让card在ListBox里被选中是,边框从原来的黑色变为蓝色?

    2013年1月9日 9:21

答案

  • <DataTemplate DataType="{x:Type local:person}">
        <Border Name="border" BorderBrush="Black" BorderThickness="5">
            <TextBlock Text="{Binding Name}" />
        </Border>
        <DataTemplate.Triggers>
            <DataTrigger Binding="{Binding IsSelected, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBoxItem}}}" Value="True">
                <Setter TargetName="border" Property="BorderBrush" Value="Red"/>
            </DataTrigger>
        </DataTemplate.Triggers>
    </DataTemplate>

    Sheldon _Xiao
    MSDN Community Support | Feedback to us
    Develop and promote your apps in Windows Store
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2013年1月10日 7:37
    版主

全部回复

  • <DataTemplate DataType="{x:Type local:person}">
        <Border Name="border" BorderBrush="Black" BorderThickness="5">
            <TextBlock Text="{Binding Name}" />
        </Border>
        <DataTemplate.Triggers>
            <DataTrigger Binding="{Binding IsSelected, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ListBoxItem}}}" Value="True">
                <Setter TargetName="border" Property="BorderBrush" Value="Red"/>
            </DataTrigger>
        </DataTemplate.Triggers>
    </DataTemplate>

    Sheldon _Xiao
    MSDN Community Support | Feedback to us
    Develop and promote your apps in Windows Store
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2013年1月10日 7:37
    版主
  • 你的代码确实可以。

    但是,我的card类(我发现在你的代码里变成了person)还会用在其他地方单独出现,不在ListBox里。这样的话,VS调试时会给出警告,大概说找不到类型为ListBoxItem的对象。

    虽然不影响效果,但是我如果card放得比较深,那么FindAncestor一直找上去,找到Window都没找到,这样对性能影响大不大?

    2013年1月10日 11:43
  • 这个我觉得你对DataTemplate的DataType和ListBox理解的有些问题, 那个绑定是不会找不到LIstBoxItem的。


    Sheldon _Xiao
    MSDN Community Support | Feedback to us
    Develop and promote your apps in Windows Store
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2013年1月11日 7:11
    版主