버그를 생성하려면 TopDataGrid
에서 항목을 선택하십시오. 결과적으로 상품 모음은 BottomDataGrid
에로드됩니다. 이 컬렉션은 지정한대로 Name
속성으로 정렬됩니다! 그런 다음 TopDataGrid
에서 다른 항목을 선택하십시오. 결과적으로 ItemsSource
이 BottomDataGrid
이 다시로드됩니다. 이제 컬렉션은 정렬되지 않습니다! 코드에서 지정한대로 컬렉션이 나타납니다. 또한 디버거로 _customerView
을 검사하면 정렬 된 컬렉션이 표시됩니다.ObservableCollection을 ICollectionView로 정렬하면 올바르게 작동하지 않습니다.
은 내가 명시 적으로 ObservableCollection
및 ICollectionView
대신 자체를 업데이트하기 위해 UI를 명령하는 OrderBy
및 INotifyPropertyChanged
와 List
을 사용할 수 있습니다 알고 있습니다. 그러나 나는 이것이 적절한 접근법이 아니라고 생각한다.
Win 7, .Net 4.0. 복사하여 붙여 넣기 만하면됩니다. ClearSortDescriptionsOnItemsSourceChange
방법의 분류에서 삭제하고 다시 재 서술되지 않은 것처럼
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<DataGrid Grid.Row="0"
AutoGenerateColumns="False"
ItemsSource="{Binding Items}"
SelectedItem="{Binding SelectedItem, Mode=TwoWay}"
CanUserAddRows="False"
CanUserDeleteRows="False"
CanUserResizeRows="False"
CanUserSortColumns="False"
SelectionMode="Single"
SelectionUnit="FullRow">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Name}"></DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
<DataGrid Grid.Row="1"
AutoGenerateColumns="False"
ItemsSource="{Binding SelectedItem.MyCollectionView}"
CanUserAddRows="False"
CanUserDeleteRows="False"
CanUserResizeRows="False"
CanUserSortColumns="False"
SelectionMode="Single"
SelectionUnit="FullRow">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Name}"></DataGridTextColumn>
<DataGridTextColumn Binding="{Binding Index}"></DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
<Grid Grid.Row="2">
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<TextBox Grid.Column="0"
Text="{Binding Name1}"></TextBox>
<TextBox Grid.Column="1"
Text="{Binding Index}"></TextBox>
</Grid>
</Grid>
코드
public class TopGridItem
{
private ObservableCollection<BottomGridItem> _collection;
public ObservableCollection<BottomGridItem> Collection
{
get { return _collection; }
}
public String Name { get; set; }
public ICollectionView MyCollectionView
{
get
{
ICollectionView _customerView = CollectionViewSource.GetDefaultView(Collection);
_customerView.SortDescriptions.Add(new SortDescription("Name", ListSortDirection.Ascending));
return _customerView;
}
}
public TopGridItem()
{
_collection = new ObservableCollection<BottomGridItem>();
_collection.Add(new BottomGridItem { Name = "bbbbbb" });
_collection.Add(new BottomGridItem { Name = "aaaaa" });
_collection.Add(new BottomGridItem { Name = "aaaaa" });
_collection.Add(new BottomGridItem { Name = "ccccc" });
_collection.Add(new BottomGridItem { Name = "dddddd" });
}
}
public class BottomGridItem
{
public String Name { get; set; }
public String Index { get; set; }
}
/// <summary>
/// Логика взаимодействия для NewWindow.xaml
/// </summary>
public partial class ProgressWindow : INotifyPropertyChanged
{
public TopGridItem _selectedItem;
public String Name1 { get; set; }
public String Index { get; set; }
public ObservableCollection<TopGridItem> Items { get; set; }
public TopGridItem SelectedItem
{
get { return _selectedItem; }
set
{
_selectedItem = value;
OnPropertyChanged("SelectedItem");
}
}
public ProgressWindow()
{
InitializeComponent();
DataContext = this;
Items = new ObservableCollection<TopGridItem>();
Items.Add(new TopGridItem {Name = "One"});
Items.Add(new TopGridItem {Name = "Two"});
Items.Add(new TopGridItem {Name = "Three"});
}
#region INotifyPropertyChanged
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
#endregion
}
UPDATE는
private void ClearSortDescriptionsOnItemsSourceChange()
{
this.Items.SortDescriptions.Clear();
this._sortingStarted = false;
List<int> descriptionIndices = this.GroupingSortDescriptionIndices;
if (descriptionIndices != null)
descriptionIndices.Clear();
foreach (DataGridColumn dataGridColumn in (Collection<DataGridColumn>) this.Columns)
dataGridColumn.SortDirection = new ListSortDirection?();
}
private static object OnCoerceItemsSourceProperty(DependencyObject d, object baseValue)
{
DataGrid dataGrid = (DataGrid) d;
if (baseValue != dataGrid._cachedItemsSource && dataGrid._cachedItemsSource != null)
dataGrid.ClearSortDescriptionsOnItemsSourceChange();
return baseValue;
}
보인다. 나는 이것이 문제라고 생각한다. 이 INotifyPropertyChanged
를 구현 있도록
MyCollectionView
속성을 변경하여
TopGridItem
클래스를 변경
O) :
public ICollectionView MyCollectionView
{
get
{
return _myCollectionView;
}
set
{
_myCollectionView = value;
OnPropertyChanged("MyCollectionView");
}
}
ICollectionView _myCollectionView;
지금처럼 TopGridItem
에 공용 메서드를 추가합니다
https://msdn.microsoft.com/en- 'TopGridItem' 생성자 ('SortDescriptions'와 함께)에서'_collection'의 /usr/library/ystem.windows.data.listcollectionview (v = vs.110) .aspx) 항상'MyCollectionView'에 반환합니다. – dkozl
@ dkozl does't 작업. 모두 같음 – monstr
사용자가 위쪽 모눈 항목을 클릭 할 때 _collection 목록을 정렬하거나 정렬하지 않겠습니까? – SwDevMan81