回答編集履歴

1

見直しキャンペーン中

2023/07/27 13:46

投稿

TN8001
TN8001

スコア9862

test CHANGED
@@ -1,211 +1,106 @@
1
1
  > aaaの部分にはVMクラスのプロパティに紐づけたいのですがやり方がわからず困っています。
2
-
3
-
4
2
 
5
3
  質問文は単純ですが2つの要素が合わさっています。
6
4
 
7
-
8
-
9
5
  1つ目はビジュアルツリーの問題です。
10
6
 
11
-
12
-
13
- `DataGridColumn`はビジュアルツリーに含まれないため、素直には`ViewModel`にアクセスできません。
7
+ `DataGridColumn`はビジュアルツリーに含まれないため、素直にはViewModelにアクセスできません。
14
-
15
8
  [ツリー - WPF .NET Framework | Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/desktop/wpf/advanced/trees-in-wpf)
16
-
17
-
18
9
 
19
10
  よくある手法は中継役(`BindingProxy`)を用意して、それ経由でアクセスします。
20
11
 
21
-
22
-
23
12
  `x:Reference`でコントロールを参照しても動きました。
24
-
25
13
  [c# - Binding datagrid column width - Stack Overflow](https://stackoverflow.com/questions/9313586/binding-datagrid-column-width)
26
-
27
-
28
14
 
29
15
  ---
30
16
 
31
-
32
-
33
17
  2つ目は`DataGridLength`の問題です。
34
18
 
35
-
36
-
37
19
  `aaa`の型がわかりませんが、おそらく`double`等数値を想定されていると思います。
38
-
39
20
  `DataGridLength`は`Star`や`Auto`指定できるので、単なる数値ではありません
40
-
41
21
  [DataGridLength 構造体 (System.Windows.Controls) | Microsoft Docs](https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.controls.datagridlength)
42
22
 
43
-
44
-
45
23
  `TwoWay`でバインドするには双方向のコンバータが必要です。
46
-
47
24
  [wpf - How do I databind a ColumnDefinition's Width or RowDefinition's Height? - Stack Overflow](https://stackoverflow.com/questions/147908/how-do-i-databind-a-columndefinitions-width-or-rowdefinitions-height)
48
25
 
49
-
50
-
51
- ```xaml
26
+ ```xml
52
-
53
27
  <Window
54
-
55
28
  x:Class="Questions338171.MainWindow"
56
-
57
29
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
58
-
59
30
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
60
-
61
31
  xmlns:local="clr-namespace:Questions338171"
62
-
63
32
  Width="800"
64
-
65
33
  Height="450">
66
-
67
34
  <Window.DataContext>
68
-
69
35
  <local:ViewModel />
70
-
71
36
  </Window.DataContext>
72
-
73
37
  <Window.Resources>
74
-
75
38
  <local:BindingProxy x:Key="proxy" Data="{Binding}" />
76
-
77
39
  <local:DataGridLengthConverter x:Key="dataGridLengthConverter" />
78
-
79
40
  </Window.Resources>
80
-
81
41
  <DockPanel>
82
-
83
42
  <Slider
84
-
85
43
  x:Name="slider"
86
-
87
44
  DockPanel.Dock="Top"
88
-
89
45
  Maximum="{Binding ActualWidth, RelativeSource={RelativeSource self}}"
90
-
91
46
  Value="{Binding Width}" />
92
-
93
47
  <TextBlock DockPanel.Dock="Top" Text="{Binding Width}" />
94
-
95
48
  <DataGrid AutoGenerateColumns="False">
96
-
97
49
  <DataGrid.Columns>
98
-
99
50
  <DataGridTextColumn
100
-
101
51
  Width="{Binding Data.Width, Converter={StaticResource dataGridLengthConverter}, Mode=TwoWay, Source={StaticResource proxy}}"
102
-
103
52
  Binding="{Binding}"
104
-
105
53
  Header="BindingProxy" />
106
-
107
54
  <DataGridTextColumn
108
-
109
55
  Width="{Binding Value, Converter={StaticResource dataGridLengthConverter}, Mode=TwoWay, Source={x:Reference slider}}"
110
-
111
56
  Binding="{Binding}"
112
-
113
57
  Header="x:Reference" />
114
-
115
58
  </DataGrid.Columns>
116
-
117
59
  aaaa
118
-
119
60
  </DataGrid>
120
-
121
61
  </DockPanel>
122
-
123
62
  </Window>
124
-
125
63
  ```
126
64
 
127
-
128
-
129
- ```C#
65
+ ```cs
130
-
131
66
  using CommunityToolkit.Mvvm.ComponentModel;
132
-
133
67
  using System;
134
-
135
68
  using System.Globalization;
136
-
137
69
  using System.Windows;
138
-
139
70
  using System.Windows.Controls;
140
-
141
71
  using System.Windows.Data;
142
72
 
143
-
144
-
145
73
  namespace Questions338171
146
-
147
74
  {
148
-
149
75
  class BindingProxy : Freezable
150
-
151
76
  {
152
-
153
77
  public object Data { get => GetValue(DataProperty); set => SetValue(DataProperty, value); }
154
-
155
78
  public static readonly DependencyProperty DataProperty
156
-
157
79
  = DependencyProperty.Register(nameof(Data), typeof(object), typeof(BindingProxy),
158
-
159
80
  new PropertyMetadata(null));
160
-
161
81
  protected override Freezable CreateInstanceCore() => new BindingProxy();
162
-
163
82
  }
164
83
 
165
-
166
-
167
84
  class DataGridLengthConverter : IValueConverter
168
-
169
85
  {
170
-
171
86
  public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
172
-
173
87
  => new DataGridLength((double)value);
174
-
175
88
  public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
176
-
177
89
  => ((DataGridLength)value).Value;
178
-
179
90
  }
180
91
 
181
-
182
-
183
92
  class ViewModel : ObservableObject
184
-
185
93
  {
186
-
187
94
  private double width = 150;
188
-
189
95
  public double Width { get => width; set => SetProperty(ref width, value); }
190
-
191
96
  }
192
97
 
193
-
194
-
195
98
  public partial class MainWindow : Window
196
-
197
99
  {
198
-
199
100
  public MainWindow() => InitializeComponent();
200
-
201
101
  }
202
-
203
102
  }
204
-
205
103
  ```
206
104
 
207
-
208
-
209
105
  こちらを使用しています。
210
-
211
106
  [NuGet Gallery | CommunityToolkit.Mvvm 7.0.2](https://www.nuget.org/packages/CommunityToolkit.Mvvm/7.0.2)