行选择绑定

时间:2011-12-29 11:47:41

标签: c# .net wpf binding

我窗口的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的单击按钮之间的关系

1 个答案:

答案 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

传递DataConext

如果要从Button的click方法获取实际的ListViewItem UI对象,而不是数据对象,则必须导航Visual Tree才能找到它。您可以使用一些VisualTreeHelpers found here轻松找到Button所属的ListViewItem

var listViewItem = VisualTreeHelpers.FindAncestor<ListViewItem>(myButton);