2010-10-25 5 views
3

I ont la ListView suivante:ListView DataTemplate liaison

<ListView Name="listView"> 
      <ListView.View> 
       <GridView> 
        <GridView.ColumnHeaderContainerStyle> 
         <Style TargetType="{x:Type GridViewColumnHeader}"> 
          <Setter Property="Visibility" 
            Value="Collapsed"/> 
         </Style> 
        </GridView.ColumnHeaderContainerStyle> 
        <GridViewColumn> 
         <GridViewColumn.CellTemplate> 
          <DataTemplate> 
           <StackPanel> 
            <CheckBox 
              Margin="0" 
              VerticalAlignment="Center" 
              IsChecked="{Binding IsChecked}" 
              Visibility="{Binding IsChecked, Converter={StaticResource boolToVis}}"> 
            </CheckBox> 
           </StackPanel> 
          </DataTemplate> 
         </GridViewColumn.CellTemplate> 
        </GridViewColumn> 
        <GridViewColumn> 
         <GridViewColumn.CellTemplate> 
          <DataTemplate> 
           <TextBlock Margin="0" 
              Text="{Binding Text}"/> 
          </DataTemplate> 
         </GridViewColumn.CellTemplate> 
        </GridViewColumn> 
       </GridView> 
      </ListView.View> 
     </ListView> 

Les éléments de la ListView sont du type ci-dessous:

public class CheckBoxListViewItemSource : INotifyPropertyChanged 
{ 
    public CheckBoxListViewItemSource(String text) 
    { 
     m_text = text; 
    } 

    public bool IsChecked 
    { 
     get { return m_checked; } 
     set 
     { 
      if (m_checked == value) return; 
      m_checked = value; 
      RaisePropertyChanged("IsChecked"); 
     } 
    } 

    public String Text 
    { 
     get { return m_text; } 
     set 
     { 
      if (m_text == value) return; 
      m_text = value; 
      RaisePropertyChanged("Text"); 
     } 
    } 

    public override string ToString() 
    { 
     return Text; 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    private void RaisePropertyChanged(string propName) 
    { 
     PropertyChangedEventHandler eh = PropertyChanged; 
     if (eh != null) 
     { 
      eh(this, new PropertyChangedEventArgs(propName)); 
     } 
    } 

    private bool m_checked; 
    private String m_text; 
} 

La visibilité de la case dans la ListView est lié à la valeur de IsChecked de ListViewItem. Le convertisseur est un simple bool convertisseur de visibilité:

public class BoolToVisibilityConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, 
          CultureInfo culture) 
    { 
     if (value is Boolean) 
     { 
      return ((bool)value) ? Visibility.Visible : Visibility.Collapsed; 
     } 

     return value; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, 
           CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

Dans le code derrière de ListView je:

void listView_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     foreach (var item in e.RemovedItems) 
     { 
      CheckBoxListViewItemSource source = item as CheckBoxListViewItemSource; 
      source.IsChecked = false; 
     } 
     foreach (var item in e.AddedItems) 
     { 
      CheckBoxListViewItemSource source = item as CheckBoxListViewItemSource; 
      source.IsChecked = true; 
     } 
    } 

La liaison pour la visibilité de case à cocher ne fonctionne pas pour moi. La valeur IsChecked par défaut est false, de sorte que la liste apparaît sans cases à cocher. Si je sélectionne un élément, la case à cocher n'apparaît pas.

Toutefois, si la valeur par défaut de IsChecked est définie sur true, tous les éléments de liste apparaissent avec une case à cocher et si je sélectionne un élément, puis que je le désélectionne, la case à cocher disparaît correctement. Ce que j'essaye de réaliser est que tous les articles démarrent sans la case à cocher, sélectionnant un article affiche une case à cocher cochée, et désélectionnant un article cache la case à cocher.

Des idées où je me trompe?

Répondre

1

Définissez manuellement la largeur du premier GridViewColumn sur une valeur fixe. Il semble que ListView en définit la largeur à zéro s'il ne contient rien et ne met pas à jour la largeur lorsque les cases à cocher commencent à apparaître.

Vous pouvez également modifier le code de BoolToVisibilityConverter pour renvoyer Visibility.Hidden au lieu de Visibility.Collapsed.

+0

Pour ajouter plus d'espace Hidden leaves sur l'interface utilisateur pour l'élément, tandis que Collapsed ne le fait pas. –

1

Je sais que cela a été répondu, mais je suis arrivé à ce problème en utilisant les éléments suivants:

<GridViewColumn Header="MyColumn"> 
     <GridViewColumn.CellTemplate> 
       <DataTemplate> 
        <ContentPresenter Content="{Binding MyItem, UpdateSourceTrigger=PropertyChanged}" ContentTemplate="{StaticResource myTemplate}"/> 
       </DataTemplate> 
     </GridViewColumn.CellTemplate> 
</GridViewColumn> 

Et dans la fenêtre j'avais un DataTemplate défini pour le type MyItem était:

<Window.Resources> 
     <DataTemplate DataType="{x:Type myViewModels:MyItemViewModel}" x:Key="myTemplate" > 
      ...template code 
     </DataTemplate> 
</Window.Resources> 
Questions connexes