2016-05-13 5 views
0

Ich verwende eine ListView in wpf mvvm-Muster, deren SelectedItem-Bindung mit dem ViewModel erfolgt. Das Problem, mit dem ich konfrontiert bin, ist, sobald ich das Kontrollkästchen aktivieren, die SelectedItem-Bindung funktioniert nicht sofort. Es funktioniert nur, wenn ich irgendwo außerhalb der Checkbox und deren jeweiligem Inhalt wieder klicke.Listenansicht Ausgewählte Elementbindung in wpf mvvm

Meine Listview ist wie folgt:

<Grid> 
      <Grid.Resources> 
       <DataTemplate x:Key="checkboxHeaderTemplate"> 
        <CheckBox IsChecked="{Binding Path=DataContext.AllSelected,RelativeSource={RelativeSource AncestorType=UserControl },Mode=TwoWay}"> 
        </CheckBox> 
       </DataTemplate> 

       <DataTemplate x:Key="CheckBoxCell"> 
        <!--<CheckBox Checked="CheckBox_Checked" />--> 
        <CheckBox IsChecked="{Binding Path=IsSelected, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" > 
        </CheckBox> 
       </DataTemplate> 

       <DataTemplate x:Key="TextCell"> 
        <TextBlock Text="Usecasename"> 
        </TextBlock> 
       </DataTemplate> 

       <DataTemplate x:Key="ButtonCell"> 
        <Button Content="{Binding Path=UsecaseName, Mode=TwoWay}" > 
        </Button> 
       </DataTemplate> 
      </Grid.Resources> 

      <ListView SelectedItem="{Binding SelectedSection}" ItemsSource="{Binding Path=UsecaseListItems}" > 
       <ListView.View> 
        <GridView> 
         <GridView.Columns> 

          <GridViewColumn HeaderTemplate="{StaticResource checkboxHeaderTemplate}" 
             CellTemplate="{StaticResource CheckBoxCell}" Width="auto"> 
          </GridViewColumn> 

          <GridViewColumn HeaderTemplate="{StaticResource TextCell}" 
             CellTemplate="{StaticResource ButtonCell}" Width="auto"> 
          </GridViewColumn> 
         </GridView.Columns> 
        </GridView> 
       </ListView.View> 
      </ListView> 
     </Grid> 

Die HomeViewModel, mit dem ich die Selected itm der Listenansicht bin verbindlich ist wie folgt:

private UseCase _selectedSection; 
     public UseCase SelectedSection 
     { 
      get { return _selectedSection; } 
      set 
      { 
       _selectedSection = value; 
       if (this.SelectedSection.UsecaseName == ("CCS01") && (this.SelectedSection.IsSelected == true)) 
       { 
        this.ContentWindow = new CCS01(); 
       } 
       else if (this.SelectedSection.UsecaseName == ("CCS02") && (this.SelectedSection.IsSelected == true)) 
       { 
        this.ContentWindow = new CCS02(); 
       } 
       else if (this.SelectedSection.UsecaseName == ("ECS52") && (this.SelectedSection.IsSelected == true)) 
       { 
        this.ContentWindow = new ECS52(); 
       } 
       else 
        this.ContentWindow = new Default(); 
       OnPropertyChanged("SelectedSection"); 
      } 
     } 

und die UseCase Klasse ist dies:

public class UseCase: BaseNotifyPropertyChanged 
    { 
     public string UsecaseName { get; set; } 



     private bool _IsSelected; 
     public bool IsSelected 
     { 
      get { return _IsSelected; } 
      set 
      { 
       _IsSelected = value; 
       OnPropertyChanged("IsSelected"); 

      } 
     } 




    } 

Bitte schlagen Sie vor, welche Korrektur sollte ich tun, so dass es die Bindung direkt treffen sollte Als ich die Checkboxen ankreuze.

+0

Hier ist ein gutes Beispiel von Rachel Lim, die genau zeigt, was Sie versuchen zu erreichen ... https://rachel53461.wordpress.com/2011/12/18/navigation-with-mvvm-2/ – Monty

Antwort

0

Sie sollten das Kontrollkästchen ändern diese Bindung des CheckBoxCell zu so etwas wie:

<DataTemplate x:Key="CheckBoxCell"> 
       <!--<CheckBox Checked="CheckBox_Checked" />--> 
       <CheckBox IsChecked="{Binding Path=IsSelected, 
          RelativeSource={RelativeSource FindAncestor, 
        AncestorType={x:Type ListViewItem}}, 
          Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" > 
       </CheckBox> 
      </DataTemplate> 

Und für diese Arbeit benötigen Sie SelectionMode zu Einzel

<ListView SelectedItem="{Binding SelectedSection}" 
ItemsSource="{Binding Path=UsecaseListItems}" SelectionMode="Single"> 

Und tun dies in Ihrem Viewmodel

zu setzen
private UseCase _selectedSection; 
     public UseCase SelectedSection 
     { 
      get { return _selectedSection; } 
      set 
      { 
       DeSelectAll(); 
       _selectedSection = value; 
       _selectedSection.IsSelected = true; 
       OnPropertyChanged("SelectedSection"); 
      } 
     } 

     private void DeSelectAll() 
     { 
      foreach (var item in UsecaseListItems) 
      { 
       item.IsSelected = false; 
      } 
     } 
+0

Was passiert SelectedItem.IsSelected Eigenschaft Wert, wenn ich das andere Element wählen, anstatt auf klicken die CheckBox? – Davy