C# WPF MVVM: Сохранить последовательность и ширину столбцов DataGrid

	internal class Model
	{
		public string Name { get; set; }
		public int Id { get; set; }
	}
    internal class ViewModel
    {
        public ObservableCollection<Model> Items { get; }

        public ViewModel()
        {
            Items = new ObservableCollection<Model>()
            {
                new Model() { Name = "Item1", Id = 60 },
                new Model() { Name = "Item2", Id = 666 }
            };
        }
	}

XAML:

	<Window.DataContext>
		<local:ViewModel />
	</Window.DataContext>

	<DataGrid ItemsSource="{Binding Items}"
			  AutoGenerateColumns="False"
			  GridLinesVisibility="None"
			  CanUserAddRows="False">
		<DataGrid.Columns>
			<DataGridTextColumn Header="Name" Binding="{Binding Name}" />
			<DataGridTextColumn Header="ID" Binding="{Binding Id}" />
		</DataGrid.Columns>
	</DataGrid>

Застрял на том, что хочу поменять столбцы местами и сохранить их последовательность. Поменять местами - не проблема. Можно просто перетащить мышкой. А как потом это сохранить?
Можно пойти простым путём и добавить в модель свойства DisplayIndex и Width. Потом привязать их в XAML. Тогда сохранить параметры не будет проблемой. Но тогда нарушится принцип распределения ответственности, так как модель не должна знать ничего о столбцах таблицы. Она вообще ни о чём не должна знать. Обращаться к компонентам окна напрямую из ViewModel по-умолчанию тоже нельзя. А если проделать некоторые хитровывернутые операции с кодом и сделать так, чтобы стало можно (хотя, это вроде как работает не со всеми компонентами и я не уверен, что с DataGrid это тоже сработает), на MVVM так делать не принято. На MVVM всё должно делаться через XAML и привязки, как я понял :thinking:
А как тогда сохранить параметры столбцов? В интернете не смог найти способ. Вероятно, он там есть и я на него даже натыкался, но просто не понял, как это работает. Не люблю копипастить код, который не понимаю.

Вот что выдал ИИ гугла. Насколько понимаю, DisplayIndex будет храниться в ViewModel, а не в Model.

Но ведь когда мы задаём ItemSource для DataGrid (или ListView), все привязанные к столбцам свойства ищутся в модели, а не во ViewModelи.

Не пишу на C#. Потыкался, вроде binding “видит” свойство ViewModel, но значение свойства почему-то остается -1, как бы я его не инициализировал.

В binding можно установить любое свойство (даже несуществующее) и ошибки не будет. Код скомпилируется и будет работать. Однако, вижуалка будет подчёркивать первую букву имени свойства в XAML.

Если назначено свойство ItemSource, то все свойства привязываются к модели (во всяком случае, у меня это так). Какое значение там будет, если указать несуществующее свойство - я не знаю :man_shrugging: Когда я случайно так делал, у меня выдавало пустую строку.