2010-07-14 5 views
0

J'essaie de faire quelque chose qui devrait être simple cerveau-mort, cependant, je ne peux pas le faire fonctionner. J'affiche une liste d'éléments dans une liste. J'ai ajouté des cases à cocher dans la zone de liste afin que l'utilisateur puisse sélectionner plusieurs éléments. Cependant, même si l'objet dans la liste liée à ListBox a une propriété "IsSelected", il n'est pas lié. Je pourrais utiliser de l'aide car cela me rend fou.La liaison de la propriété IsSelectedProperty d'une ListBox dans WPF ne fonctionne pas. J'ai besoin d'aide

<Style x:Key="CheckBoxListStyle" TargetType="{x:Type ListBox}"> 
    <Setter Property="SelectionMode" Value="Multiple"></Setter> 
    <Setter Property="ItemContainerStyle"> 
     <Setter.Value> 
      <Style TargetType="{x:Type ListBoxItem}"> 
       <Setter Property="Margin" Value="2"/> 
       <Setter Property="Template"> 
        <Setter.Value> 
         <ControlTemplate TargetType="{x:Type ListBoxItem}"> 
          <CheckBox Focusable="False" 
             IsChecked="{Binding Path=IsSelected, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}"> 
           <ContentPresenter></ContentPresenter> 
          </CheckBox> 
         </ControlTemplate> 
        </Setter.Value> 
       </Setter> 
      </Style> 
     </Setter.Value> 
    </Setter> 

<ListBox 
         Style="{StaticResource CheckBoxListStyle}" 
         IsEnabled="{Binding Path=SpecificClients.Value, Mode=OneWay}" 
         ItemsSource="{Binding Path=SelectedClients}" 
         VirtualizingStackPanel.IsVirtualizing="True" 
         VirtualizingStackPanel.VirtualizationMode="Recycling" 
         ScrollViewer.VerticalScrollBarVisibility="Auto" 
         MaxHeight="95"> 
       </ListBox> 

Dans le modèle Voir je donne les résultats suivants:

public IEnumerable<SelectedClientVM> SelectedClients 
.... 
public class SelectedClientVM 
    { 
     public bool IsSelected { get; set; } 
     public Client Client { get; set; } 
     public override string ToString() 
     { 
      return Client.SearchText; 
     } 
    } 

Répondre

1

Je pense que ce que vous voulez peut être mieux réalisé en définissant un DataTemplate à utiliser pour chaque élément de la ListBox. Un DataTemplate spécifie la manière dont vous souhaitez obtenir un élément de données (un Client dans votre cas) rendu dans le contrôle ListBox.

Voici mon code XAML pour un DataTemplate simple.

<DataTemplate x:Key="clientTemplate" DataType="{x:Type local:Client}"> 
     <Grid> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="Auto" /> 
       <ColumnDefinition /> 
      </Grid.ColumnDefinitions> 
      <CheckBox IsChecked="{Binding IsSelected}" /> 
      <TextBlock Grid.Column="1" Text="{Binding Name}" Margin="5,0,0,0" /> 
     </Grid> 
    </DataTemplate> 

Voilà comment j'ai mentionné dans la déclaration ListBox:

<ListBox ItemsSource="{Binding SelectedClients}" 
     VirtualizingStackPanel.IsVirtualizing="True" 
     ItemTemplate="{StaticResource clientTemplate}" /> 

En second lieu, à Accordons répondre, vous voulez être sûr que votre classe implémente ClientINotifyPropertyChanged. De plus, vous souhaiterez exposer votre liste de clients à l'aide d'une collection qui prend en charge les notifications de modification. J'utilise habituellement ObservableCollection<T>.

+0

thanx dude. Ça l'a cloué. Ça me rendait fou. J'ai essayé de lier ListBoxItem dans un modèle de données, ou d'utiliser RelativeAncestor, et rien de tout cela n'a fonctionné. Je n'ai jamais pensé à utiliser un modèle de données pour le type de machine virtuelle que j'utilisais, mais maintenant que je vois cela ... cela semble évident. – Keith

+0

Bien, heureux que cela a résolu pour vous. Pour moi, c'était vraiment un moment où j'allumais l'ampoule une fois que j'ai enveloppé mon cerveau autour du modèle. –

0

Cela ne peut être le seul problème, mais si vous voulez que la vue de la mise à jour en fonction de votre ViewModel que vous aurez à mettre en œuvre INotifyPropertyChanged (ou quelque chose qui fait un travail similaire) sur votre propriété IsSelected.

+0

Le problème est que ViewModel n'est pas mis à jour par des modifications dans la vue. Lorsque je souhaite mettre à jour la vue à partir du modèle de vue, il s'agit d'une opération ponctuelle, qui est gérée manuellement en tirant OnPropertychanged ("SelectedClients") – Keith

Questions connexes