List<String>の中身を軽く編集しようと思って、DataGridやListBoxのItemsSourceに指定したら動かないっ・・・
こんなListを
public List<String> Items { get { return _Items; } set { _Items = value; } } private List<string> _Items = new List<String> { "One", "Two", "Three" };
簡単編集だ!
<!-- 編集するとエラー (両方向のバインドには、Path または XPath が必要です。) --> <DataGrid ItemsSource="{Binding Items}"> <DataGrid.Columns> <DataGridTextColumn Binding="{Binding .}" /> </DataGrid.Columns> </DataGrid> <!-- 編集しても反映されない --> <ListBox ItemsSource="{Binding Items}"> <ListBox.ItemTemplate> <DataTemplate> <TextBox Text="{Binding .}" /> </DataTemplate> </ListBox.ItemTemplate> </ListBox>
動かない!
Path にドット.つけてるのに😭
はい、ドット.とか無意味なんですね。
バインドしている対象が値型(文字、数値など)では参照を変更できないので編集はできません!
諦めましょう。
何かしらのクラスに内包してやるしか無いみたいです。
こんな感じにして
public static List<String> Items = new List<String> { "One", "Two", "Three" }; public List<BindingProxy<string>> ItemsProxy { set { _ItemsProxy = value; } get { return _ItemsProxy; } } private List<BindingProxy<string>> _ItemsProxy = new List<BindingProxy<string>>( Items.Select( x => new BindingProxy<string>( x ) ) ); public class BindingProxy<T> { public BindingProxy() {} public BindingProxy( T value ) { this.Value = value; } public T Value { get; set; } }
今度こそ簡単編集だ!
<DataGrid ItemsSource="{Binding ItemsProxy}"> <DataGrid.Columns> <DataGridTextColumn Binding="{Binding Value}" /> </DataGrid.Columns> </DataGrid> <ListBox ItemsSource="{Binding ItemsProxy}"> <ListBox.ItemTemplate> <DataTemplate> <TextBox Text="{Binding Value}" /> </DataTemplate> </ListBox.ItemTemplate> </ListBox>
あとでItemsProxyをItemsに戻してデータ編集完了です。