2014-10-09 39 views
0

對於令人困惑的標題感到抱歉。我有一個動態生成的網格綁定到數據表。點擊列時,我創建了一個新的類,用於存儲過濾所需的信息(不同的列表項目,列索引,頁眉顏色等)。我將它們存儲在列表中。我有一個模板標題列,用於創建標籤和按鈕我使用代碼隱藏獲取列索引並設置視圖模型中的屬性將數據表列綁定到存儲在列表中的類屬性

一切都很好,除非我不太確定如何將標籤的背景顏色綁定到。名單,其中columnIndex屬性=實際列索引我知道這可能仍然相當混亂,這裏是代碼:

的XAML模板列:

<local:UserControlViewBase.Resources> 
    <Style TargetType="DataGridColumnHeader"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate> 
        <Border BorderBrush="Black" BorderThickness="1"> 
         <StackPanel Orientation="Horizontal" Width="150"> 
          <Label Width="90" Content="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type DataGridColumnHeader}},Path=Column.Header}" 
           Padding="12,0,12,0" HorizontalAlignment="Center" VerticalAlignment="Center" /> 
          <Button Content="Ok" Padding="12,0,12,0" HorizontalAlignment="Center" VerticalAlignment="Center"/> 
         </StackPanel> 
        </Border> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</local:UserControlViewBase.Resources> 

代碼隱藏(Xaml.cs文件):

private void TestListView_MouseUp(object sender, RoutedEventArgs e) 
    { 
     GenericQueueViewModel temp = (GenericQueueViewModel)this.DataContext; 
     DataGridColumnHeader oTest; 
     Button oBtn; 
     int x = 0; 
     if (!(e.OriginalSource.GetType() == typeof(Button))) 
     { 
      return;    
     } 
     else 
     { 
      oBtn = (Button)e.OriginalSource; 
      DataGrid oTst = (DataGrid)e.Source; 
      DataGridColumn oCol = (DataGridColumn)oTst.Columns.FirstOrDefault(y => y.Header == oBtn.DataContext); 
      int index = oTst.Columns.IndexOf(oCol); 

      DataGridColumnHeader colHeader = GetHeader(oCol, oTst); 


      double newX = temp.OldScrollValue;    
      for (int i = 0; i < index; i++) 
      { 
       newX += oTst.Columns[i].ActualWidth; 
      } 

      Thickness oThick = new Thickness(newX, -122, 0, 0); 
      temp.FilterWindowMargin = oThick; 
      x = (sender as DataGrid).Columns.IndexOf(oCol); 
      colHeader.Background = System.Windows.Media.Brushes.LightSkyBlue; 
     } 

     temp.UpdateFilterList(x); 
    } 

ViewModel類:

[SerializableAttribute] 
    public class FilterList 
    { 
     private int _columnIndex; 

     public int ColumnIndex 
     { 
      get { return _columnIndex; } 
      set 
      { 
       _columnIndex = value; 
      } 
     } 

     private System.Windows.Media.Brush _headerColor; 

     public System.Windows.Media.Brush HeaderColor 
     { 
      get { return _headerColor; } 
      set 
      { 
       _headerColor = value; 
      } 
     } 


     private Nullable<bool> _selectAll; 

     public Nullable<bool> SelectAll 
     { 
      get { return _selectAll; } 
      set 
      { 
       _selectAll = value; 
      } 
     } 


     private List<CheckedListItem<DistinctColumnData>> _filterItems; 

     public List<CheckedListItem<DistinctColumnData>> FilterItems 
     { 
      get { return _filterItems; } 
      set 
      { 
       LastFilterItems = _filterItems; 
       _filterItems = value; 
      } 
     } 

     private List<CheckedListItem<DistinctColumnData>> _viewableFilterItems; 

     public List<CheckedListItem<DistinctColumnData>> ViewableFilterItems 
     { 
      get { return _viewableFilterItems; } 
      set 
      { 
       _viewableFilterItems = value; 
      } 
     } 


     private List<CheckedListItem<DistinctColumnData>> _lastFilterItems; 

     public List<CheckedListItem<DistinctColumnData>> LastFilterItems 
     { 
      get { return _lastFilterItems; } 
      set { _lastFilterItems = value; } 
     } 

     private bool _isFiltered; 

     public bool IsFiltered 
     { 
      get { return _isFiltered; } 
      set 
      { 
       _isFiltered = value; 
      } 
     } 


     private bool _isFilterable; 

     public bool IsFilterable 
     { 
      get { return _isFilterable; } 

      set 
      { 
       _isFilterable = value; 
      } 
     } 


     public FilterList() 
      : this(-1) { } 

     public FilterList(int columnIndex) 
      : this(columnIndex, new List<CheckedListItem<DistinctColumnData>>()) { } 

     public FilterList(List<CheckedListItem<DistinctColumnData>> filterList) 
      : this(-1, filterList) { } 

     public FilterList(int columnIndex, List<CheckedListItem<DistinctColumnData>> filterList) 
      : this(columnIndex, filterList, false) { } 

     public FilterList(int columnIndex, List<CheckedListItem<DistinctColumnData>> filterList, bool isFilterable) 
     { 
      FilterItems = filterList; 
      ColumnIndex = columnIndex; 
      IsFilterable = isFilterable; 
      HeaderColor = System.Windows.Media.Brushes.Transparent; 
     } 
    } 

視圖模型列表:

private List<FilterList> _filterColumns; 

    public List<FilterList> FilterColumns 
    { 
     get { return _filterColumns; } 
     set 
     { 
      _filterColumns = value; 
      OnPropertyChanged(() => FilterColumns); 
     } 
    } 

所以基本上,我需要在XAML DataGridColumnHeader模板綁定以某種方式將標籤背景標籤到列表中FilterList.columnIndex = DataGrid列被點擊的列表中。在代碼隱藏代碼行(xaml.cs):

DataGridColumnHeader colHeader = GetHeader(oCol, oTst); 

確實得到一個標題對象(GetHeader是我在不同的崗位在這裏找到的方法)。但它似乎沒有做任何事情。如果我從column0得到標題,並將其顏色設置爲LightBlue,然後再次單擊column0,header.background = null ...即使當我逐步瀏覽它時,它也會更改爲十六進制值。下次它抓住頭部,background = null再次...

這是一個通用的表,需要能夠綁定到任何發送的表,並有任意數量的列/行,並提供過濾功能。過濾器功能已經在運行,我無法弄清楚如何更改標題的背景顏色(技術上,標題頂部的標籤),以便他們可以直觀地看到過濾了哪些列。

+0

所以我已經發現如何獲取標籤背景改變,我設置主要的stackpanel背景。它適用於0索引,當我過濾column0。但是,它正在改變所有列(如預期的那樣,它是一個模板)。我需要知道如何將列索引動態添加到列中。這也不會檢查列表中的columnIndex屬性。 Background =「{Binding DataContext.FilterColumns [0] .HeaderColor,RelativeSource = {RelativeSource Mode = FindAncestor,AncestorType = {x:Type local:UserControlViewBase}},Mode = TwoWay,UpdateSourceTrigger = PropertyChanged}」> – Aaron 2014-10-09 18:24:05

+0

輕微更正。它看起來像標題顏色正在改變,但它在Stackpanel下不可見,即使是Background =「Transparent」...也不知道爲什麼。當我點擊按鈕時,標題變成藍色,並且按鈕消失。當我關閉過濾器窗口時,按鈕返回並且顏色丟失。我刪除了標籤,並給了按鈕margin = 125,0,0,0,以便強制列寬,但仍然看不到標題顏色... – Aaron 2014-10-09 21:56:17

回答

0

我想我明白了。必須使用轉換器。改變代碼如下,添加轉換器:

<local:UserControlViewBase.Resources> 
    <Converters:BGConverter x:Key="BackgroundConverter"/> 
    <Style TargetType="DataGridColumnHeader"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate> 
        <Border BorderBrush="Black" BorderThickness="1" Width="150"> 
         <StackPanel x:Name="testtest" Orientation="Horizontal" 
          Background="{Binding Converter={StaticResource BackgroundConverter}, ConverterParameter={x:Reference TestListView}}">           
          <Label Width="90" Content="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type DataGridColumnHeader}},Path=Column.Header}" 
           Padding="12,0,12,0" HorizontalAlignment="Center" VerticalAlignment="Center" /> 
          <Button Content="Ok" Padding="12,0,12,0" HorizontalAlignment="Right" VerticalAlignment="Center" Margin="10,0,0,0"/> 
         </StackPanel> 
        </Border> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style>   
</local:UserControlViewBase.Resources> 

現在,從轉換器,我可以添加邏輯。這使用了Singleton,所以如果你不是粉絲,你需要找到另一種方法來抓住你的虛擬機。它通過VM進入轉爐前幾次,所以我將它存儲在我的mainviewmodel,然後一旦它開始傳入列使用它:

public class BGConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
    { 
     GenericQueueViewModel oQueue; 
     System.Windows.Media.Brush returnBrush; 

     DataGrid oGrid = (DataGrid)parameter; 
     if (value == null) 
     { 
      returnBrush = System.Windows.Media.Brushes.Transparent; 
     } 
     else if (oGrid == null) 
     { 
      returnBrush = System.Windows.Media.Brushes.Transparent; 
     } 
     else if (value.GetType() == typeof(GenericQueueViewModel)) 
     { 
      MainViewModel.Instance.GenericVM = (GenericQueueViewModel)value; 
      returnBrush = System.Windows.Media.Brushes.Transparent; 
     } 

     else 
     { 
      oQueue = MainViewModel.Instance.GenericVM; 
      DataGridColumn oCol = oGrid.Columns.FirstOrDefault(y => y.Header == value); 
      int colIndex = oGrid.Columns.IndexOf(oCol); 
      string colName = (string)value; 

      var fList = oQueue.FilterColumns.FirstOrDefault(y => y.ColumnIndex == colIndex && y.IsFiltered == true); 
      if (fList == null) 
      { 
       returnBrush = System.Windows.Media.Brushes.Transparent; 
      } 
      else 
      { 
       returnBrush = System.Windows.Media.Brushes.Red; 
      } 
     } 

     return returnBrush; 
    } 
} 
相關問題