gpt4 book ai didi

c# - 折叠行时动态调整数据网格列的大小

转载 作者:行者123 更新时间:2023-11-30 18:14:40 25 4
gpt4 key购买 nike

我有一个 DataGrid 控件 dgChangesMade,ItemsSource = ObservableCollection<CheckinPath> .

第一列,dgPath,是一个DataGridTemplateColumn,由

  • 复选框
  • 文本 block 。转换器为后者返回一个相对路径。数据网格行的可见性绑定(bind)到 IsVisible 属性。

除了DataGrid控件,我还有一个CheckBox控件:

  • IsChecked 事件绑定(bind)到 bool 属性 IsChecked。 setter 设置绑定(bind)到 DataGrid 的项目源的对象的 IsVisible 属性。因此,当复选框被(未)选中时,数据网格行会折叠/显示。
  • SourceUpdated 事件绑定(bind)到 CheckBox_SourceUpdated

正如 Scott 在 another thread 中指出的那样:

The DataGrid will increase column sizes to fit as the data becomes longer, but it does not automatically decrease column sizes when the length of the data decreases

所以在 CheckBox_SourceUpdated 事件中我

  1. 将列宽设置为 0
  2. 强制更新 DataGrid 的布局
  3. 将列宽设置为自动

不幸的是,这没有帮助。当(取消)选中复选框控件时,列宽会在需要时增加(参见屏幕截图中的 2),但不会根据数据网格列中数据的长度自动减小(参见屏幕截图中的 3,3 显示与1).

有什么想法吗?

截图 enter image description here

XAML

<DataGrid Name='dgChangesMade' Width='Auto' ItemsSource="{Binding Path=ChangesMade}">
<DataGrid.Resources>
<DataGridTemplateColumn Width='Auto' x:Key='dgPath' Header='Path' IsReadOnly='True' x:Shared='False'>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<StackPanel Orientation='Horizontal' VerticalAlignment='Center'>
<CheckBox IsChecked='{Binding IsChecked, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}'>
<TextBlock Text='{Binding Converter={StaticResource CheckinPathConverter}, ConverterParameter="Path"}' />
</StackPanel>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

<Style x:Key='dgShowHideRow' TargetType='DataGridRow'>
<Setter Property='Visibility' Value='{Binding IsVisible, Converter={StaticResource BoolToVisibilityConverter}, ConverterParameter="Collapsed", Mode=TwoWay}' />
</Style>

<DataGrid.Columns>
<StaticResource ResourceKey='dgPath' />
<StaticResource ResourceKey='dgStatus' />
<StaticResource ResourceKey='dgLock' />
</DataGrid.Columns>
<DataGrid.ItemContainerStyle>
<StaticResource ResourceKey='dgShowHideRow' />
</DataGrid.ItemContainerStyle>
</DataGrid>
<!-- Setter of this checkbox sets the IsVisible property of the datagrid bound objects -->
<CheckBox IsChecked='{Binding IsChecked, UpdateSourceTrigger=PropertyChanged, NotifyOnSourceUpdated=True}' SourceUpdated='CheckBox_SourceUpdated'/>

代码隐藏

private void CheckBox_SourceUpdated(object sender, DataTransferEventArgs e)
{
foreach (var c in dgChangesMade.Columns)
c.Width = 0;

dgChangesMade.UpdateLayout();
foreach (var c in dgChangesMade.Columns)
c.Width = new DataGridLength(1, DataGridLengthUnitType.Auto);
}

型号

public class CheckinPath : ViewModelBase
{
private bool _isVisible;
public bool IsVisible
{
get { return _isVisible; }
set
{
if (_isVisible != value)
{
_isVisible = value;
RaisePropertyChanged(nameof(IsVisible));
}
}
}
}

最佳答案

我解决了这个问题。

  1. 而不是将数据网格项目源绑定(bind)到 ObservableCollection , 它现在绑定(bind)到 CollectionView .这样,可以使用 CollectionViewSource Filter 显示/隐藏数据网格中的行。属性(property)。过滤发生在 ViewModel 中。
  2. CollectionView之后已被过滤,数据网格的列宽被重置。因为数据网格是一个控件,所以重置发生在 View 的代码后面(使用 MVVM Light Toolkit 中的 Messenger)

XAML

<DataGrid x:Name='dg'
ItemsSource='{Binding ChangesMadeView}'
AutoGenerateColumns='False'
IsReadOnly='True' .../>
<CheckBox IsChecked='{Binding IsChecked, UpdateSourceTrigger=PropertyChanged}' .../>

窗口代码隐藏

public partial class TestWindow : Window
{
public static readonly Guid Token = new Guid();
public TestWindow()
{
InitializeComponent();
Messenger.Default.Register<NotificationMessage>(this, Token, ResetColumnWidth);
}

private void ResetColumnWidth(NotificationMessage notMessage)
{
if (notMessage.Notification == "ResetColumnWidth")
{
foreach (DataGridColumn c in dg.Columns)
{
c.Width = 0;
c.Width = DataGridLength.Auto;
}
}
}
}

View 模型

private IList<CheckinPath> _changesMade = new List<CheckinPath>();
public ICollectionView ChangesMadeView { get; private set; }

public TestViewModel()
{
LoadData(); //Loads data for _changesMade
ChangesMadeView = CollectionViewSource.GetDefaultView(_changesMade);
}

private bool _isChecked;

public bool IsChecked
{
get { return _isChecked; }
set
{
if (_isChecked != value)
{
_isChecked = value;
RaisePropertyChanged(nameof(IsChecked));
ChangesMadeView.Filter = checkinPath => { //do logic for filtering. Returns true or false ;};
Messenger.Default.Send(new NotificationMessage("ResetColumnWidth"), TestWindow.Token); //notify the code behind of the view
};
}
}

关于c# - 折叠行时动态调整数据网格列的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49858891/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com