2014-10-09 2 views
0

혼란스러운 제목 죄송합니다. 나는 동적으로 생성 된 그리드를 datatable에 바인딩했습니다. 열을 클릭하면 필터링에 필요한 정보를 저장하는 새로운 클래스를 만듭니다 (항목의 개별 목록, 열 인덱스, 머리글 색 등). 목록에 저장합니다. 레이블 및 단추를 만드는 템플릿 머리글 열이 있습니다. 머리글의 맨 위에있는 스택 패널에서 코드 인덱스를 사용하여 뷰 모델의 속성을 설정합니다.목록에 저장된 클래스 속성에 datatable 열을 바인딩

레이블의 배경색을 바인딩하는 방법을 잘 모르지만 모든 것이 잘 작동합니다. .

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> 
columnIndex에 속성 = 실제 열 인덱스가 나는 것을 알고는 아마 아직도 상당히 혼란 목록은 여기에 코드입니다 뒤에

코드 (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 열이있는 목록의 FilterList에 배경을 어떻게 든 레이블을 지정합니다. 코드 숨김 코드의 라인 (xaml.cs) :

DataGridColumnHeader colHeader = GetHeader(oCol, oTst); 

은 (GetHeader 내가 여기에 다른 게시물에 발견하는 방법입니다) 헤더 개체를 가져 않습니다. 그러나 실제로 아무 것도하지 않는 것 같습니다. column0에서 헤더를 가져 와서 LightBlue로 설정 한 다음 column0을 다시 클릭하면 header.background = null ... 내가 단계별로 진행하면 16 진수 값으로 변경됩니다 .. 다음에 다시 헤더 = background = null을받습니다.

이 테이블은 모든 열/행 수와 함께 전송 된 모든 테이블에 바인드 할 수 있어야하며 필터링 기능을 제공해야하는 일반 테이블입니다. 필터 기능이 이미 작동 중입니다. 머리글의 배경색 (기술적으로 머리글 상단의 레이블)을 변경하여 시각적으로 어떤 열이 필터링되는지 확인할 수 없습니다.

+0

그래서 내가하는 레이블 배경을 얻는 방법을 발견했다 변경, 나는 메인 stackpanel 배경으로 설정합니다. 그것은 column0을 필터링 할 때 0 인덱스와 함께 작동합니다. 그러나 모든 열을 변경하고 있습니다 (예상대로 .. 템플릿입니다). 동적으로 열 인덱스를 열에 연결하는 방법을 알아야합니다. 또한 List 에서 columnIndex 속성을 확인하지 않습니다. Background = "{Binding DataContext.FilterColumns [0] .HeaderColor, RelativeSource = {RelativeSource 모드 = FindAncestor, AncestorType = {x : 유형 로컬 : UserControlViewBase}}, 모드 = TwoWay, UpdateSourceTrigger = PropertyChanged}"> – Aaron

+0

약간의 수정.헤더 색상이 변경되는 것처럼 보이지만, Background = "Transparent"인 경우에도 Stackpanel에서는 보이지 않습니다. 이유는 확실하지 않습니다. 단추를 클릭하면 머리글이 파란색으로 바뀌고 단추가 사라집니다. 필터 윈도우를 닫으면 버튼이 다시 나타나고 색상이 사라집니다. 나는 레이블을 제거하고 버튼에 여백 = 125,0,0,0을 부여하여 열 너비를 강요하지만 헤더 색상을 볼 수 없도록했습니다. – Aaron

답변

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> 

이제 변환기에서 로직을 추가 할 수 있습니다. 싱글 톤을 사용하므로 팬이 아닌 경우 VM을 잡을 다른 방법을 찾아야합니다. 이 컨버터 처음 몇 시간에 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; 
    } 
} 
관련 문제