実現したいこと
- WinUI3で規格の決まっていないデータを入力しDataGridで表示させたい。
- DataGridの機能(ソートやセルの編集など)を行えるようにしたい。
- 基本的にはMVVMで考えています。
前提
- WinUI3 / C# で実装しています。
- CommunityToolkit.WinUI.UI.Controls (7.1.2)をNugetでインストール
- Prism.Core (8.1.97) をNugetでインストール
また、DataGridにで表示させたいデータの規格は決まっていないため、WPFで可能であったItemsourceにDataTableをバインドさせたいとおもっていましたが、それが不可のため、次のWebサイトを参考に動的にデータを設定できるようにしました。
https://learn.microsoft.com/en-us/answers/questions/849470/win-ui-3-load-datagrid-from-datatable
さらに、MVVMで実装しているため、ViewModelでDataGridを操作できるように、参照渡しで渡しています(コードビハインドの18行目、21行目~24行目)。
発生している問題・エラーメッセージ
表示ボタンをクリックすると(図1)、データが生成され、DataGrid上に表示されることは確認できましたが、DatGridの機能であるソートやセルの編集などができません。(図2)
図1
- ExeDispDataGrid()での操作
- DataGridを参照渡ししている事
あたりが原因かと思いますが、対処方法の検討がつきません。
何かヒントをいただけたらと思っております。
該当のソースコード
Viewのコード
xml
1<?xml version="1.0" encoding="utf-8"?> 2<Window 3 x:Class="TeraTail0001.MainWindow" 4 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 5 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 6 xmlns:local="using:TeraTail0001" 7 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 8 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 9 xmlns:controls="using:CommunityToolkit.WinUI.UI.Controls" 10 mc:Ignorable="d"> 11 12 <Grid> 13 <StackPanel Orientation="Vertical"> 14 <Button Content="表示" Command="{x:Bind ViewModel.DispDataGrid}"/> 15 <controls:DataGrid 16 x:Name="MyDataGrid" 17 AutoGenerateColumns="False" 18 GridLinesVisibility="All" 19 SelectionMode="Extended" 20 IsReadOnly="False" 21 CanUserSortColumns="{x:Bind ViewModel.MyCanUserSortColumns, Mode=TwoWay}"/> 22 <TextBlock Text="{x:Bind ViewModel.Para, Mode=TwoWay}"/> 23 </StackPanel> 24 </Grid> 25</Window>
コードビハインド
C#
1using CommunityToolkit.WinUI.UI.Controls; 2using Microsoft.UI.Xaml; 3 4// To learn more about WinUI, the WinUI project structure, 5// and more about our project templates, see: http://aka.ms/winui-project-info. 6 7namespace TeraTail0001 8{ 9 /// <summary> 10 /// An empty window that can be used on its own or navigated to within a Frame. 11 /// </summary> 12 public sealed partial class MainWindow : Window 13 { 14 private MainWindowViewModel ViewModel { get; } = new(); 15 public MainWindow() 16 { 17 this.InitializeComponent(); 18 DataGridRef(ref MyDataGrid); 19 } 20 21 void DataGridRef(ref DataGrid tmp) 22 { 23 ViewModel.MyDataGridVM = tmp; 24 } 25 } 26} 27
ViewModel
C#
1using CommunityToolkit.WinUI.UI.Controls; 2using Microsoft.UI.Xaml;//PropertyPath 3using Microsoft.UI.Xaml.Data;//Binding 4using Prism.Commands;//DelegateCommand 5using Prism.Mvvm;//BindableBase(SetProperty) 6using System.Data;//DataTable 7 8namespace TeraTail0001 9{ 10 public class MainWindowViewModel : BindableBase 11 { 12 //データテーブルに表示する内容 13 public DataGrid MyDataGridVM { get; set; } = new(); 14 //パラメータ 15 public string Para { get => _Para; set => SetProperty(ref _Para, value); } 16 private string _Para; 17 //ソートOn・Off 18 public bool MyCanUserSortColumns { get => _MyCanUserSortColumns; set => SetProperty(ref _MyCanUserSortColumns, value); } 19 private bool _MyCanUserSortColumns; 20 21 //表示 22 public DelegateCommand DispDataGrid { get; private set; } 23 24 public MainWindowViewModel() 25 { 26 Para = ""; 27 DispDataGrid = new DelegateCommand(ExeDispDataGrid, CanExeDispDataGrid); 28 MyCanUserSortColumns = false; 29 } 30 31 private bool CanExeDispDataGrid() 32 { 33 return true; 34 } 35 private void ExeDispDataGrid() 36 { 37 DataTable MyDataTable = new(); 38 39 MyDataTable.Columns.Add("Name"); 40 MyDataTable.Columns.Add("Age"); 41 42 MyDataTable.Rows.Add("aaa", "11"); 43 MyDataTable.Rows.Add("bbb", "22"); 44 MyDataTable.Rows.Add("ccc", "33"); 45 46 for (int i = 0; i < MyDataTable.Columns.Count; i++) 47 { 48 MyDataGridVM.Columns.Add(new CommunityToolkit.WinUI.UI.Controls.DataGridTextColumn() 49 { 50 Header = MyDataTable.Columns[i].ColumnName, 51 Binding = new Binding { Path = new PropertyPath("[" + i.ToString() + "]") } 52 }); 53 } 54 55 var collectionObjects = new System.Collections.ObjectModel.ObservableCollection<object>(); 56 foreach (DataRow row in MyDataTable.Rows) 57 { 58 collectionObjects.Add(row.ItemArray); 59 } 60 MyDataGridVM.ItemsSource = collectionObjects; 61 62 MyCanUserSortColumns = true; 63 64 Para = "MyDataGridVM.CanUserSortColumns : " + MyDataGridVM.CanUserSortColumns + "\n"; 65 Para += "MyDataGridVM.IsReadOnly : " + MyDataGridVM.IsReadOnly+ "\n"; 66 67 } 68 69 } 70} 71
試したこと
View、ViewModelのコードにありますが、MyCanUserSortColumns の値をバインドしてみても意図した動作にはなりませんでした。
情報の過不足、表現がおかしいところなどあるかと思いますがよろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2023/07/06 12:09
2023/07/07 04:14
2023/11/24 08:35 編集