我窗口的XAML:
<ListView Grid.Row="0" Name="files">
<ListView.Resources>
<DataTemplate x:Key="CheckboxTemplate">
<CheckBox IsChecked="{Binding Save, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" IsEnabled="{Binding Path=File, Converter={StaticResource NotEmptyStringConverter}}" />
</DataTemplate>
<DataTemplate x:Key="SelectFileTemplate">
<Button Click="Button_Click" Content="Select" />
</DataTemplate>
</ListView.Resources>
<ListView.View>
<GridView AllowsColumnReorder="False">
<GridViewColumn Header=" " Width="auto" CellTemplate="{StaticResource CheckboxTemplate}" />
<GridViewColumn Header="Datei" DisplayMemberBinding="{Binding File}" Width="auto"/>
<GridViewColumn CellTemplate="{StaticResource SelectFileTemplate}" />
</GridView>
</ListView.View>
</ListView>
我希望看到Button(SelectFileTemplate),如果a)ListView的行被选中并且b)如果File-Property为空
为此我可以在Button的Visibility-Property上使用MultiBinding。 我知道如何绑定到文件属性,但如何绑定到行选择?
以及如何确定(在Button_Click代码隐藏中)我按下了哪个Select-Button?我需要ListViewItem和此ListViewItem的单击按钮之间的关系
答案 0 :(得分:3)
你可以使用RelativeSource DataTrigger
找到Row并绑定到它的IsSelected
值
这是一个例子
<Style TargetType="{x:Type Button}">
<Setter Property="Visibility" Value="Collapsed" />
<Style.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding Path=File}" Value="{x:Null}" />
<Condition Binding="{Binding Path=IsSelected, RelativeSource={RelativeSource AncestorType={x:Type ListViewItem}}}" Value="True" />
</MultiDataTrigger.Conditions>
<Setter Property="Visibility" Value="Visible" />
</MultiDataTrigger>
</Style.Triggers>
</Style>
要获取ListViewItem的数据对象,您只需在Button的Click方法中使用Button的DataContext,尽管如果使用MVVM设计模式,我宁愿使用Button的Command
属性指向方法在ViewModel中并通过CommandParameter
如果要从Button的click方法获取实际的ListViewItem
UI对象,而不是数据对象,则必须导航Visual Tree才能找到它。您可以使用一些VisualTreeHelpers found here轻松找到Button所属的ListViewItem
var listViewItem = VisualTreeHelpers.FindAncestor<ListViewItem>(myButton);