趣味は車輪の再発明♪

[WPF] DataGridのカラムを読み取り専用プロパティにバインドする


詳解 OpenCV ―コンピュータビジョンライブラリを使った画像処理・認識
Gary Bradski Adrian Kaehler
オライリージャパン
売り上げランキング: 25,746


■ たかみんつ / ソフト開発メモINDEX /


DataGridのカラムを読み取り専用のプロパティにバインドする場合、バインディングモードをOneWayに指定します。 OneTimeでも良いけど、特別な理由がないなら、という意味で。少なくともTwoWayはダメ。 (バインディングモードについては、このページの下にまとめています)

特に指定していないときや、TwoWayでは、セルをダブルクリックしたときに、以下の例外(InvalidOperationException)が投入されます。

InvalidOperationException

TwoWay または OneWayToSource バインドは、型 'SampleData' の読み取り専用プロパティ 'Name' では動作できません。

サンプル(VS2010 ExpressのWPFプロジェクトで確認)

MainWindow.xaml

<Window x:Class="UseWpfDataGrid.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded">
<Grid>
    <DataGrid AutoGenerateColumns="False" Height="200"
            HorizontalAlignment="Left" Margin="26,54,0,0"
            Name="dataGrid1" VerticalAlignment="Top" Width="200" 
            ItemsSource="{Binding} >
        <DataGrid.Columns>
            <DataGridTextColumn
                Header="名前" Width="Auto"
                Binding="{Binding Path=Name,Mode=OneWay}"/>
                                    <!-- **** ここ↑ **** -->
        </DataGrid.Columns>
    </DataGrid>
</Grid>
</Window>

MainWindow.xaml.cs

using System;
using System.Collections.Generic;
using System.Windows;
namespace UseWpfDataGrid {
    /// 
    /// MainWindow.xaml の相互作用ロジック
    /// 
    public partial class MainWindow : Window {
        public MainWindow() {
            InitializeComponent();
        }
        private List<GridRowData> rowDataList = new List<GridRowData>();
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            rowDataList.Add(new GridRowData("C#"));
            rowDataList.Add(new GridRowData("Javascript"));
            rowDataList.Add(new GridRowData("php"));
            rowDataList.Add(new GridRowData("C++"));
            dataGrid1.DataContext = rowDataList;
        }
        class GridRowData {
            private string name = null;
            public SampleData(string name) {
                this.name = name;
            }
            //読み取り専用のプロパティ
            public string Name {
                get {
                    return name;
                }
            }
        }
    }
}

バインディングモード(BindingMode)について

Targetはバインド先のプロパティ(たとえばDataGridのセル)で、Sourceはバインド元(データモデル)のプロパティです。

OneWayToSourceとTwoWayでは読み取り専用のプロパティにバインドできません。

BindingMode Target ← Source Target → Source 画面で編集
OneTime △(起動時、またはDataContext設定時) × ×
OneWay × ×
TwoWay
OneWayToSource ×

詳細は、MSDNのBindingMode 列挙体


Pythonプロフェッショナルプログラミング 第2版
秀和システム (2015-05-21)
売り上げランキング: 1,813


クラウドではじめる機械学習 Azure MLでらくらく体験
脇森浩志 杉山雅和 羽生貴史
リックテレコム
売り上げランキング: 2,081

実践Node.js プログラミング (Programmer's SELECTION)
Mike Cantelon Marc Harter T.J. Holowaychuk Nathan Rajlich
翔泳社
売り上げランキング: 40,213

■ たかみんつ / ソフト開発メモINDEX /



RSS Feed Widget
[WPF] DataGridのカラムを読み取り専用プロパティにバインドする
(http://bicycle.life.coocan.jp/takamints/index.php/doc/wpfDataGridColumnRdonly)
by Koji Takami ( email: vzg03566@gmail.com, GitHub: takamin )