【问题标题】:Binding on Row Selection绑定行选择
【发布时间】:2011-12-29 11:47:40
【问题描述】:

我的窗口的 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>

我想查看按钮 (SelectFileTemplate),如果 a) ListView 的行被选中,b) 如果 File-Property 为空

为此,我可以在按钮的 Visibility-Property 上使用 MultiBinding。 我知道如何绑定到文件属性,但是如何绑定到行选择?

以及如何确定(在 Button_Click 代码隐藏中)我按下了哪个 Select-Button?我需要 ListViewItem 和此 ListViewItem 的单击按钮之间的关系

【问题讨论】:

  • 你想在Button_Click中做什么?
  • 在 Button_Click 中打开了 SaveFileDialog,用户选择了一个文件,路径 (sfd.FileName) 应该写入 ListViewItem 的 File-Property - 那么如何访问这个 ListViewItem?

标签: c# .net wpf binding


【解决方案1】:

您可以使用 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);

【讨论】:

  • 谢谢你,瑞秋。你的第一个 sn-p 工作得很好。为了解决第二个问题,我已经将我的对象绑定到按钮的数据上下文,现在我可以访问它了
猜你喜欢
  • 2018-04-01
  • 2013-02-25
  • 2019-09-13
  • 1970-01-01
  • 2021-07-12
  • 2020-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多