2010-10-25 126 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的複選框的可見性被綁定到值的ListViewItem的IsChecked。該轉換器是一個簡單的布爾能見度轉換器:

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

要在UI的元素上進一步添加隱藏的葉子空間,而Collapsed不會。 – 2010-10-25 20:06:01

1

我知道這已經回答了,但我用瞭解決此問題如下:

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

並在窗口我已經爲MyItem是類型定義一個DataTemplate:

<Window.Resources> 
     <DataTemplate DataType="{x:Type myViewModels:MyItemViewModel}" x:Key="myTemplate" > 
      ...template code 
     </DataTemplate> 
</Window.Resources> 
相關問題