2010-10-25 4 views
3

У меня есть следующие ListView:ListView DataTemplate связывания

<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> 

Элементы в ListView имеют ниже типа:

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; 
} 

Видимость флажка в ListView привязан к значению IsChecked из ListViewItem. Преобразователь представляет собой простой BOOL для видимости преобразователя:

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(); 
    } 
} 

В коде позади от ListView У меня есть:

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; 
     } 
    } 

обязательными для видимости флажок не работает для меня. Значение по умолчанию IsChecked равно false, поэтому список отображается без флажков. Если я выберу элемент, флажок не появится.

Однако, если я установил значение по умолчанию IsChecked равным true, все элементы списка появятся с помощью флажка, и если я выберу элемент и затем сниму его, флажок будет корректно исчезать.

То, что я пытаюсь достичь, состоит в том, что все элементы начинаются без флажка, при выборе элемента отображается установленный флажок, и снятие выделения элемента скрывает этот флажок.

Любые идеи, в которых я ошибаюсь?

ответ

1

Ручная установка ширины первой GridViewColumn на фиксированное значение. Кажется, ListView устанавливает ширину его в ноль, если он не содержит ничего и не обновляет ширину, когда начинают появляться флажки.

В качестве альтернативы, измените код BoolToVisibilityConverter, чтобы вернуть Visibility.Hidden вместо Visibility.Collapsed.

+0

К дополнительно добавьте скрытое пространство листа в пользовательский интерфейс для элемента, а Collapsed - нет. –

1

Я знаю, что это был дан ответ, но я обойти эту проблему, используя следующие:

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

И в окне я был DataTemplate определен для того типа, который MyItem был:

<Window.Resources> 
     <DataTemplate DataType="{x:Type myViewModels:MyItemViewModel}" x:Key="myTemplate" > 
      ...template code 
     </DataTemplate> 
</Window.Resources> 
Смежные вопросы