数据绑定

时间:2016-06-03 08:28:58

标签: c# xaml uwp uwp-xaml

我有一个ListBox我为其项目定义了DataTemplate

<ListBox.ItemTemplate>
    <DataTemplate>
        <Border>
            <TextBlock Text="{Binding Name}" />
        </Border>
    </DataTemplate>
</ListBox.ItemTemplate>

我用来向ListBox添加元素的类如下:

public class MyItem
{
    public string Name
    { get; set; }
}

现在我需要更改ListBox项目的背景,例如选择项目时:

private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    if (e.AddedItems.Count == 1)
    {
        var item = e.AddedItems.First() as MyItem;
    }
}

问题是该项目的类型为MyItem,而我也需要访问BorderTextBlock个对象。

2 个答案:

答案 0 :(得分:1)

您可以对RelativeSource样式使用精美的Border绑定:

<Border.Style>
    <Style TargetType="Border">
        <Style.Triggers>
            <DataTrigger Binding="{Binding IsSelected, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ListBoxItem}}" Value="True">
                <Setter Property="Background" Value="Pink"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>
</Border.Style>

这将创建一个DataTrigger,它将绑定到父IsSelected的{​​{1}}属性,当它被选中时,它将设置ListBoxItem的背景颜色到Border

答案 1 :(得分:0)

  

问题是该项是MyItem类型,而我也需要访问Border和TextBlock对象。

如果您只想在选择项目时更改背景,可以参考评论中的答案和@Mike Eason的答案。

但我认为您的主要目的是使用Border事件SelectionChanged来获取所选项目中的ListBox控件。正如@ S.Akbari所提供的,您可以使用VisualTreeHelper来查找边框,但您可以使用其他更简单的方法。

private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    var listBox = sender as ListBox;
    var container = listBox.ContainerFromItem(listBox.SelectedItem) as ListBoxItem;
    var border = container.ContentTemplateRoot as Border;
    border.Background = new SolidColorBrush(Colors.Pink);
}

使用ItemsControl.ContainerFromItem method可以帮助您找到与指定项目对应的容器,然后由于BorderDataTemplate中的根控件,我们可以使用ContentControl.ContentTemplateRoot property获取ContentTemplate属性指定的数据模板的根元素。