2017-01-28 2 views
0

Ich habe eine Situation hier.Aktivierungsschaltfläche basierend auf ListView Kontrollkästchen aktiviert/deaktiviert WPF

Ich habe ein ListView mit Kontrollkästchen. Kontrollkästchen sind als Datenvorlage definiert. Ich habe ein weiteres Stack-Panel und es enthält eine Schaltfläche. Meine Anforderung ist, dass beim Laden des Fensters zunächst keines der Kontrollkästchen aktiviert und die Schaltfläche deaktiviert werden soll. Wenn der Benutzer auf eines der Kontrollkästchen klickt, sollte die Schaltfläche aktiviert sein. Wenn der Benutzer alle Kontrollkästchen deaktiviert, sollte die Schaltfläche deaktiviert sein.

Ich benutze MVVM Muster mit Vieh Rahmen.Mit Hilfe von Ereignissen konnte ich diese Funktionalität erreichen.

aber meine Frage ist, können wir dieses Szenario in XAML selbst behandeln. Können Trigger oder Konverter verwendet werden?

Ich bin neu in WPF und keine tiefen Kenntnisse über WPF. Jede Hilfe wird geschätzt.

Ich habe versucht, Trigger zu verwenden. Da die Checkboxen jedoch innerhalb von ListView liegen und als Datenvorlage definiert sind, kann ich nicht auf den Elementnamen des Kontrollkästchens vom Button-Stil zugreifen.

Grobe Beschreibung ist wie folgt

<ListView x:Name="MylistView" ItemsSource="{Binding Collection}" Height="250" 
       SelectionMode="Single" 
       BorderBrush="Transparent"> 
     <ListView.ItemTemplate> 
      <DataTemplate> 
       <CheckBox x:Name="Checkbox" Content="{Binding Description}" IsChecked="{Binding IsEnable, Mode=TwoWay}" /> 
      </DataTemplate> 
     </ListView.ItemTemplate> 
</ListView> 

<StackPanel Orientation="Horizontal"> 
     <Button x:Name="Save" Content="{l:Language Key=SAVE}" Width="50" Height="25" Margin="10" 
       Command="{Binding Updpate, Source={StaticResource proxy}}"> 
<Button.Style> 
//How do i refer checkbox from this level. I get only "Mylistview" control at this level 
    </Button.Style> 
    </Button> 
</StackPanel> 

Dank im Voraus

Antwort

1

Sie haben eine Eigenschaft Sichtbarkeit mit Property Ereignis zu erklären, implementiert als:

private bool _Visibility; 
public bool Visibility 
{ get 
     { 
     return _Visibility ; 
     } 
    set 
     { 
      _Visibility = value; 
      RaisePropertyChanged("Visibility"); 
     } 
    } 

internal void RaisePropertyChanged(string prop) 
{ 
    if (PropertyChanged != null) 
     { 
     PropertyChanged(this, new PropertyChangedEventArgs(prop)); 
     } 
} 


public event PropertyChangedEventHandler PropertyChanged; 

Entwurf

<Button Name="btnsdf" Width="35" Height="35" Style="{DynamicResource MetroCircleButtonStyle}" ToolTip="Add Denomination" > 
    <Image Width="30" Source="/Images/icons/add.png" Margin="0,1,0,0"></Image> 
    <Button.Resources> 
      <Style TargetType="Button"> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding Visibility,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Value="true"> 
         Setter Property="Visibility" Value="Visible"></Setter> 
        </DataTrigger> 
        <DataTrigger Binding="{Binding Visibility,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Value="false"> 
         <Setter Property="Visibility" Value="Collapsed"></Setter> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </Button.Resources> 
    </Button> 

Sie müssen IsEnabled für Checkbox Checked und unchecked event setzen. Ich hoffe, das wird dir eine Idee geben.

+0

Danke! Ich kann dies tun, aber aufgrund einer Implementierung ist IsChecked an die Eigenschaft gebunden, die in "Model" und nicht in ViewModel definiert ist. Die Datenquelle für die Listenansicht ist in ViewModel definiert. Button IsEnabled ist im Ansichtsmodell gebunden. Derzeit verwende ich Ereignisse, um vom Modell zum Modell zu kommunizieren, wenn das Kontrollkästchen aktiviert/deaktiviert ist. Dies dient meinem Zweck. Aber kann ich anstelle von Ereignisbenachrichtigungen in xaml und viewmodel umgehen? Wenn "IsChecked" nicht in Model definiert ist, hätte diese Antwort meine Anforderung erfüllt –

+0

Sie können RaisePropertyMethod auch in Ihrem Modell implementieren. Keine Notwendigkeit, es in ViewModel zu deklarieren. – kritikaTalwar

+0

Wenn Ihnen das geholfen hat, können Sie dies als Antwort akzeptieren. – kritikaTalwar

Verwandte Themen