我在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>
答案 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依赖关系,该依赖关系又修复了上述问题的层次结构。