혼란스러운 제목 죄송합니다. 나는 동적으로 생성 된 그리드를 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을받습니다.
이 테이블은 모든 열/행 수와 함께 전송 된 모든 테이블에 바인드 할 수 있어야하며 필터링 기능을 제공해야하는 일반 테이블입니다. 필터 기능이 이미 작동 중입니다. 머리글의 배경색 (기술적으로 머리글 상단의 레이블)을 변경하여 시각적으로 어떤 열이 필터링되는지 확인할 수 없습니다.
그래서 내가하는 레이블 배경을 얻는 방법을 발견했다 변경, 나는 메인 stackpanel 배경으로 설정합니다. 그것은 column0을 필터링 할 때 0 인덱스와 함께 작동합니다. 그러나 모든 열을 변경하고 있습니다 (예상대로 .. 템플릿입니다). 동적으로 열 인덱스를 열에 연결하는 방법을 알아야합니다. 또한 List 에서 columnIndex 속성을 확인하지 않습니다. Background = "{Binding DataContext.FilterColumns [0] .HeaderColor, RelativeSource = {RelativeSource 모드 = FindAncestor, AncestorType = {x : 유형 로컬 : UserControlViewBase}}, 모드 = TwoWay, UpdateSourceTrigger = PropertyChanged}"> – Aaron
약간의 수정.헤더 색상이 변경되는 것처럼 보이지만, Background = "Transparent"인 경우에도 Stackpanel에서는 보이지 않습니다. 이유는 확실하지 않습니다. 단추를 클릭하면 머리글이 파란색으로 바뀌고 단추가 사라집니다. 필터 윈도우를 닫으면 버튼이 다시 나타나고 색상이 사라집니다. 나는 레이블을 제거하고 버튼에 여백 = 125,0,0,0을 부여하여 열 너비를 강요하지만 헤더 색상을 볼 수 없도록했습니다. – Aaron