2011-12-29 64 views
2

我窗口的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),如果一)ListView控件的行IST选择和b)如果文件的属性为空

为此,我可以在Button的可见性属性上使用MultiBinding。 我知道如何绑定到文件属性,但如何绑定到行选择?

以及如何确定(在Button_Click代码隐藏中)我按下的选择按钮?我需要的ListViewItem的这一个ListViewItem

+0

你想在'Button_Click'内做什么? – 2011-12-29 12:55:56

+0

在Button_Click中打开一个SaveFileDialog,用户选择一个文件,路径(sfd.FileName)应该写入ListViewItem的File-Property - 所以如何访问这个ListViewItem? – 0xDEADBEEF 2011-12-29 13:32:49

回答

3

你可以使用的RelativeSource DataTrigger找到行并绑定到它的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> 

并在2002点击按钮之间的关系获取ListViewItem的数据对象,你可以在你的Button的Click方法中简单地使用Button的DataContext,但如果使用MVVM设计模式,我宁愿使用Button的Command属性指向ViewModel中的方法并传递DataConext n到CommandParameter

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

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

谢谢你rachel。你的第一个片段完美地工作。为了解决第二个问题,我将我的对象绑定到了按钮的datacontext上,现在我可以访问它了 – 0xDEADBEEF 2011-12-29 17:55:24