2016-06-01 11 views
0

Ich weiß, dass es möglich ist, dies durch die Arbeit mit ICommand zu tun, aber da dies der einzige Ort in meinem ganzen Projekt ist, wo dies benötigt wird, frage ich mich, ob es vielleicht eine bessere Lösung als die Implementierung von RelayCommand und ICommand gibt zusätzliche Methode in meiner ansonsten Eigenschaft-only-Klasse?WPF: Wie setzt man Bool von DataTemplate für Button auf True?

Vielleicht kann mein Szenario hier helfen: Ich habe eine ListView, die an eine Liste von Eigenschaften gebunden ist (das ist eine benutzerdefinierte Klasse, die ich gemacht habe, um diese anzuzeigen). Ich habe eine Schaltfläche in jeder Zeile von Einträgen, die ich "IsToDelete" -Eigenschaft auf True festlegen möchte.

Wenn "IsToDelete" wahr ist, werden alle Steuerelemente, die ich in meinem ListView zeige, zusammenbrechen.

Die ganze Logik ist in Datatemplates bis zu diesem Punkt sieht der für meine Taste wie folgt aus:

<DataTemplate x:Key="DeleteButtonTemplate"> 
    <Button Name="bt_Delete" 
    Command="{Binding RelativeSource={RelativeSource AncestorType=ListView}, Path=ItemSource.DeleteClicked}"> 
    <Image Height="16" Width="16" Source="Images\RecycleBin\VSO_RecycleBin_16x.png"/> 
    <Button.Style> 
     <Style TargetType="{x:Type Button}"> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding IsToDelete}" Value="True"> 
      <Setter Property="Visibility" Value="Collapsed"/> 
      </DataTrigger> 
     </Style.Triggers> 
     </Style> 
    </Button.Style> 
    </Button> 
</DataTemplate> 

Hinweis der Befehl in diesem Datatemplate ist zur Zeit nicht wie vorgesehen funktioniert, deshalb habe ich auch bekam auf die Frage;)

im optimalen Fall würde ich etwas zu tun haben, wie:

<Setter Property="{Binding IsToDelete}" Value="True"/> 

So ist es eine Möglichkeit, es so oder zumindest zu lösen in ein weniger komplizierter Weg als ICommand mit RelayCommand?

+0

Möchten Sie 'Visibility' von' Button' auf 'Collapsed' setzen, nachdem Sie auf den' Button' geklickt haben? – StepUp

+0

Wie weisen Sie den Datenkontext der Seite/Schaltfläche zu und wo ist dieser Befehl eine IsToDelete Eigenschaft definiert? –

+0

@StepUp Ja, das ist genau das, was ich tun möchte, aber da dies nicht das einzige Steuerelement ist, das geändert werden muss, muss ich das boolesche IsToDelete auf true setzen. – ExNought

Antwort

1

Warum nicht ToggleButton verwenden und IsChecked Eigenschaft an IsToDelete binden Eigenschaft eines ViewModel?

vereinfachtes Beispiel mit ItemsControl

<ItemsControl> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <StackPanel Orientation="Horizontal"> 
       <ToggleButton Content="X" IsChecked="{Binding Path=IsToDelete}"/> 
       <Border Width="100"         
         Background="MediumPurple" 
         Margin="5"> 

        <Border.Style> 
         <Style TargetType="Border"> 
          <Setter Property="Visibility" Value="Visible"/> 
          <Style.Triggers>           
           <DataTrigger Binding="{Binding Path=IsToDelete}" Value="True"> 
            <Setter Property="Visibility" Value="Collapsed"/> 
           </DataTrigger> 
          </Style.Triggers> 
         </Style> 
        </Border.Style> 

       </Border> 
      </StackPanel> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate>    
</ItemsControl> 
+0

... Manchmal bin ich so verdammt auf ein Problem konzentriert, dass ich den einfachen Weg vermisse ^^ Ich würde immer noch gerne wissen, WENN es mit nur möglich wäre ein Knopf. Danke trotzdem – ExNought

0

könnten Sie den Click-Eventhandler der Schaltfläche verwenden. Dann brauchst du keine Befehle.

private void bt_Delete_Click(object sender, RoutedEventArgs e) 
{ 
    var btn = sender as Button; 
    YourClass dc = btn.DataContext as YourClass; 
    dc.IsToDelete = true; 
} 

Ich mag diese Lösung nicht wirklich, aber ich denke, es würde funktionieren.