Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf DataGrid:数据更改时奇怪的列自动大小调整行为_Wpf_Datagrid_Wpfdatagrid - Fatal编程技术网

Wpf DataGrid:数据更改时奇怪的列自动大小调整行为

Wpf DataGrid:数据更改时奇怪的列自动大小调整行为,wpf,datagrid,wpfdatagrid,Wpf,Datagrid,Wpfdatagrid,具有Width=“*”的列不会在具有Width=“Auto”的相邻列因其数据更改而扩展时自动收缩 我想在DataGrid中显示具有三个属性(从左到右)的对象列表: 长串 短线1 短线2 所有列都应可见:长字符串数据可以截断,而ShortString1和ShortString2应完全显示 因此,我使用以下宽度在XAML中定义列: 长串:“*” ShortString1:“自动” ShortString2:“自动” 最初一切正常,但当中间列中的值变长时,最右边的列从窗口滑出(我预计最左边的列

具有
Width=“*”
的列不会在具有
Width=“Auto”
的相邻列因其数据更改而扩展时自动收缩

我想在DataGrid中显示具有三个属性(从左到右)的对象列表:

  • 长串
  • 短线1
  • 短线2
所有列都应可见:长字符串数据可以截断,而
ShortString1
ShortString2
应完全显示

因此,我使用以下宽度在XAML中定义列:

  • 长串:“*”
  • ShortString1:“自动”
  • ShortString2:“自动”

最初一切正常,但当中间列中的值变长时,最右边的列从窗口滑出(我预计最左边的列会随着宽度为“*”而缩小)。 XAML:


修改
代码隐藏:

using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Windows;

namespace DataGridColumnWidthIssue
{
    public partial class MainWindow : Window
    {
        public ObservableCollection<Info> Infos { get; } = new ObservableCollection<Info>();

        public MainWindow()
        {
            InitializeComponent();
            Infos.Add(new Info("Veeeeeeeeery looooooooooooong striiiiiiiiiiiiiing", "Short string 1", "Short string 2"));
            DataContext = this;
        }

        private void modifyButton_Click(object sender, RoutedEventArgs e)
        {
            Infos[0].ShortString1 += "AA";
        }
    }

    public class Info : INotifyPropertyChanged
    {
        public string LongString { get; }

        string shortString1;
        public string ShortString1
        {
            get { return shortString1; }
            set
            {
                if (value != shortString1)
                {
                    shortString1 = value;
                    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("ShortString1"));
                }
            }
        }

        public string ShortString2 { get; }

        public Info(string longString, string shortString1, string shortString2)
        {
            LongString = longString;
            ShortString1 = shortString1;
            ShortString2 = shortString2;
        }

        public event PropertyChangedEventHandler PropertyChanged;
    }
}
使用System.Collections.ObjectModel;
使用系统组件模型;
使用System.Windows;
命名空间DataGridColumnWidthIssue
{
公共部分类主窗口:窗口
{
public observetecollection Infos{get;}=new observetecollection();
公共主窗口()
{
初始化组件();
添加(新信息(“Veeeeeery Looooooong Striiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii;
DataContext=this;
}
私有无效修改按钮\单击(对象发送方,路由目标)
{
Infos[0].ShortString1+=“AA”;
}
}
公共类信息:INotifyPropertyChanged
{
公共字符串长字符串{get;}
短串1;
公共字符串短字符串1
{
获取{return shortString1;}
设置
{
如果(值!=shortString1)
{
shortString1=值;
PropertyChanged?.Invoke(这是新的PropertyChangedEventArgs(“ShortString1”);
}
}
}
公共字符串ShortString2{get;}
公共信息(字符串长字符串、字符串短字符串1、字符串短字符串2)
{
长串=长串;
ShortString1=ShortString1;
ShortString2=ShortString2;
}
公共事件属性更改事件处理程序属性更改;
}
}
第1步。运行程序。

结果与预期一样:所有列都可见

第2步。按两次窗口底部的“修改”按钮。(它将“AA”添加到中间列属性(
ShortString1
)值。)

我所期望的是:

  • 长串柱收缩
  • ShortString1列拉伸
  • ShortString2列保持不变

实际发生的情况:

  • LongString列保持不变
  • ShortString1列拉伸
  • ShortString2列向右移动,部分不可见

第3步。再按“修改”3次。短字符串2几乎完全不在窗口中

一个有趣的细节是,在最大化和恢复窗口后,列宽变得与预期一样

更新:UpdateLayout()在数据更改后无效(对窗口和网格都尝试过)

第4步。最大化并恢复窗口

这种行为正确吗

是否存在获得预期行为的变通方法

谢谢你的帮助


目标框架:4.7.2。

你说最大化和恢复窗口可以解决你的问题。也许这只是在调整UpdateLayout?我试过了,但没有效果。很抱歉没有提及。Maciej S:谢谢你的编辑。你说最大化和恢复窗口可以解决你的问题。也许这只是在调整UpdateLayout?我试过了,但没有效果。谢谢你的编辑
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Windows;

namespace DataGridColumnWidthIssue
{
    public partial class MainWindow : Window
    {
        public ObservableCollection<Info> Infos { get; } = new ObservableCollection<Info>();

        public MainWindow()
        {
            InitializeComponent();
            Infos.Add(new Info("Veeeeeeeeery looooooooooooong striiiiiiiiiiiiiing", "Short string 1", "Short string 2"));
            DataContext = this;
        }

        private void modifyButton_Click(object sender, RoutedEventArgs e)
        {
            Infos[0].ShortString1 += "AA";
        }
    }

    public class Info : INotifyPropertyChanged
    {
        public string LongString { get; }

        string shortString1;
        public string ShortString1
        {
            get { return shortString1; }
            set
            {
                if (value != shortString1)
                {
                    shortString1 = value;
                    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("ShortString1"));
                }
            }
        }

        public string ShortString2 { get; }

        public Info(string longString, string shortString1, string shortString2)
        {
            LongString = longString;
            ShortString1 = shortString1;
            ShortString2 = shortString2;
        }

        public event PropertyChangedEventHandler PropertyChanged;
    }
}