2011-12-29 3 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 Selected и б) если файл-Property пуст

Для этого я могу использовать MultiBinding для свойства видимости кнопки. Я знаю, как привязываться к файловому свойству, но как привязываться к выбору строки?

и как определить (в Button_Click codebehind), который нажал кнопку выбора? Мне нужна связь между ListViewItem и нажал кнопку этого ListViewItem

+0

Что вы хотите сделать в 'Button_Click'? –

+0

В Button_Click открывается файл SaveFileDialog, пользователь выбирает файл, а путь (sfd.FileName) должен быть записан в File-Property ListViewItem - так как получить доступ к этому элементу ListViewItem? – 0xDEADBEEF

ответ

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> 

И в получить объект данных ListViewItem, вы можете просто использовать DataContext Button в методе Click Button, хотя лично при использовании шаблона проектирования MVVM я предпочел бы использовать свойство Button Command, чтобы указать на метод в ViewModel и передать DataConext i n через CommandParameter

Если вы хотите получить фактический объект U12 ListViewItem с помощью метода щелчка кнопки, а не объекта данных, вам необходимо перейти по визуальному дереву, чтобы найти его. Вы можете использовать некоторые VisualTreeHelpers found here легко найти ListViewItem кнопку принадлежит

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

спасибо rachel. ваш первый фрагмент работает отлично. для решения второй проблемы я привязал свой объект к datacontext кнопки, и теперь я могу получить к нему доступ – 0xDEADBEEF

Смежные вопросы