Как правильно установить привязку этой кнопки к родительскому ListView ItemsControl? - PullRequest
0 голосов
/ 21 июня 2019

У меня есть пользовательская кнопка, настроенная внутри шаблона ListView ItemTemplate. ItemSource Listview привязан к коллекции элементов, довольно стандартно. У меня также есть несколько ярлыков в списке, и все отлично работает, кроме кнопки.

Привязка кнопки к одному из свойств вообще не будет работать с использованием {Binding buttonName}, но она будет работать, если я использую {Binding Items/buttonName, ElementName=listView} - единственная проблема, когда я делаю это таким образом, каждая кнопка в этот listView будет иметь точно такое же имя кнопки.

Теперь проблема связана с тем, что 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 голосов
/ 21 июня 2019

Так что это в итоге стало XY проблемой . Поскольку у измененного стиля, который я использовал, было свойство с плохой связью, оно терпело неудачу, когда у родительского элемента управления не было 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, которая, в свою очередь, исправляет иерархию проблем, описанных выше.

...