下面的 XAML 片段有一個簡單的 datagrid 系結到 a ICollectionView SysPropViewCollection,它不會導致 datagrid 中顯示任何資料 - 但是,如果我將系結更改為 a ObservableCollection SystemPropertiesList, datagrid 將按預期填充。您能幫忙指出使用時系結構造/用法是否不同ICollectionView嗎?當我構建/運行應用程式時,VS2019 中沒有報告系結失敗。
XAML
<DataGrid
Style="{DynamicResource DataGridStyle1}"
IsReadOnly="True"
ColumnWidth="Auto"
AutoGenerateColumns="False"
RowHeight="20"
ItemsSource="{Binding ElementName=ConfigEditor, Path=SysPropViewModel.SysPropCollectionView}"
Grid.Row="2" Grid.ColumnSpan="2" Grid.Column="0"
IsSynchronizedWithCurrentItem="True">
<DataGrid.Columns>
<DataGridTextColumn
Header="Environment"
Binding="{Binding Path=Environment}"
MinWidth="100"
Width="Auto">
</DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
C#
private ObservableCollection<SystemProperties> systemPropertiesList;
public ICollectionView SysPropCollectionView { get; private set; }
public ObservableCollection<SystemProperties> SystemPropertiesList
{
get => systemPropertiesList;
set
{
if (!SetProperty(ref systemPropertiesList, value, () => SystemPropertiesList)) return;
SysPropCollectionView = CollectionViewSource.GetDefaultView(systemPropertiesList);
SysPropCollectionView.Refresh();
}
}
uj5u.com熱心網友回復:
您更改了 SysPropCollectionView 屬性的值,但沒有通知它。我不知道您使用的是哪個 VM 基類,所以我無法確定。
應該有這樣的東西:
public ObservableCollection<SystemProperties> SystemPropertiesList
{
get => systemPropertiesList;
set
{
if (!SetProperty(ref systemPropertiesList, value, () => SystemPropertiesList))
return;
SysPropCollectionView = CollectionViewSource.GetDefaultView(systemPropertiesList);
RaisePropertyChanged(nameof(SysPropCollectionView));
}
}
我還建議您檢查 SetProperty 方法的多載。在典型的實作中,通常會有這樣的多載:
set
{
if (!SetProperty(ref systemPropertiesList, value))
return;
補充。
為避免此類錯誤,我寧愿使用替換 SysPropCollectionView 屬性型別并進行不同的實作。因為為 DefaultView 創建一個屬性是毫無意義的。對于所有使用的集合,WPF 會自動執行此操作。
public CollectionViewSource SysPropCollectionViewSource {get;} = new();
private ObservableCollection<SystemProperties> systemPropertiesList;
public ICollectionView SysPropCollectionView { get; private set; }
public ObservableCollection<SystemProperties> SystemPropertiesList
{
get => systemPropertiesList;
set
{
if (SetProperty(ref systemPropertiesList, value))
SysPropCollectionViewSource.Source = value;
}
}
實際上,您可以洗掉 SystemPropertiesList 屬性并改用 SysPropCollectionViewSource.Source 附加屬性。這是一個 DependencyProperty,因此無需通知即可更改它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/527027.html
標籤:C#wpf数据网格
