数据绑定后如何访问ListBox中的项目

4

我有一个 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对象。

你的应用是UWP还是WPF? - SWilko
@Pikoh 我在问关于UWP的事情。 - gliderkite
抱歉,我刚刚意识到了。 - Pikoh
这个答案有帮助吗? - SWilko
1
要在代码中获取模板内的TextBlock并更改其属性,您应该使用FrameworkTemplate.FindName方法。请查看此答案:https://dev59.com/5JHea4cB1Zd3GeqPt8YN - Salah Akbari
请查看这里 - Pikoh
2个回答

1
你可以在你的Border样式上使用一个花哨的RelativeSource绑定:
<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>

这将创建一个,它将绑定到父的属性,当它被选中时,它将设置的背景颜色为。

0
问题在于该项是MyItem类型,而我需要访问Border和TextBlock对象。
如果您只想在选择项目时更改背景,则可以参考评论中的答案和@Mike Eason的答案。
但我认为您在这里的主要目的是使用ListBox的SelectionChanged事件获取所选项目中的Border控件。正如@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方法可以帮助您找到与指定项对应的容器,然后由于您的BorderDataTemplate中的根控件,因此我们可以使用ContentControl.ContentTemplateRoot属性来获取由ContentTemplate属性指定的数据模板的根元素。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接