如何正确设置此按钮与父级ListView ItemsControl的绑定?

时间:2019-06-21 10:11:34

标签: wpf xaml custom-controls datacontext

我在ListView ItemTemplate中设置了一个自定义按钮。 Listview的ItemSource绑定到非常标准的项目集合。我在列表视图中也有一些标签,除了按钮之外,其他所有东西都正常工作。

使用{Binding buttonName}根本无法将按钮绑定到其中一个属性,但是如果我使用{Binding Items/buttonName, ElementName=listView}则可以正常工作-唯一的问题是,当我这样做时,该listView中的每个按钮将具有完全相同的buttonName。

现在问题出在我的自定义按钮的DataContext设置为Self;不幸的是,必须将其设置为Self,因为我使用的自定义样式需要此样式。如果我尝试将按钮更改为UserControl(将按钮作为子控件,并在其上设置了DataContext),则由于某种原因,我将无法使用按钮的Command属性。

以下是使用自定义按钮的ListView的简化版本:

<ListView x:Name="listView" ItemsSource="{Binding MyPeopleData}">
    <ListView.ItemTemplate>
        <DataTemplate>
            <Grid>
                <Label Content="{Binding PersonName}"/>
                <ct:RevealButton Content="{Binding Items/recommendation, ElementName=listView}"/>
            </Grid>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>

如上所述,这将使列表视图中的每个项目都使用相同的recommendation属性,而不是使用其自己的属性。 如果我尝试使用

<ct:RevealButton Content="{Binding recommendation}"/> 

它只是行不通,考虑到以下自定义按钮的DataContext,这是有意义的:

<Button x:Class="RevealButton" Width="{Binding Width}" Height="{Binding Height}" Background="{Binding ButtonBackground}" DataContext="{Binding RelativeSource={RelativeSource Self}}" Style="{DynamicResource ButtonRevealStyleC}" mc:Ignorable="d">
    <Button.ContentTemplate>
        <DataTemplate>
            <ContentPresenter Content="{TemplateBinding Content}" />
        </DataTemplate>
    </Button.ContentTemplate>

</Button>

1 个答案:

答案 0 :(得分:0)

所以这最终是一个XY Problem。因为我使用的修改后的样式的绑定属性很差,所以当父控件没有将DataContext设置为self时,它将失败。 就是这样:

<SolidColorBrush Opacity="0.8" Color="{Binding ButtonBackground.Color}" />

ButtonBackground是我的自定义Button公开的依赖项属性,因此以这种方式绑定样式意味着它仅在Button的上下文本身是有效的情况下才有效。更改为此:

<SolidColorBrush Opacity="0.8" Color="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=ButtonBackground.Color}" />

修复了DataContext依赖关系,该依赖关系又修复了上述问题的层次结构。