0

datagrid と DataGridCheckBoxClumn で問題が発生しました。まず、データグリッド項目の構造体を作成します:

public struct taxRateFromDatabase
{
    public int rate { get; set; }
    public string mark { get; set; }
    public CheckBox c { get; set; }
}

その後、私のクラスで列、バインディングなどを追加します。

    StackPanel tSp = new StackPanel();
    DataGrid taxRateDataGrid = new DataGrid();
    DataGridTextColumn col0 = new DataGridTextColumn();
    DataGridTextColumn col1 = new DataGridTextColumn();
    DataGridCheckBoxColumn col2 = new DataGridCheckBoxColumn();
    Binding b = new Binding("checkBox");
    b.Mode = BindingMode.TwoWay;

    b.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;

    taxRateDataGrid.Columns.Add(col0);
    taxRateDataGrid.Columns.Add(col1);
    taxRateDataGrid.Columns.Add(col2);

    col0.Binding = new Binding("rate");
    col1.Binding = new Binding("mark");
    col2.Binding = b;

    CheckBox c = new CheckBox();
    c.Content = "a";


    col0.Header = "Stawka";
    col1.Header = "Oznaczenie";
    col2.Header = "Status";



    taxRateDataGrid.Items.Add(new taxRateFromDatabase { rate = 0, mark = "E", c = c });
    taxRateDataGrid.Items.Add(new taxRateFromDatabase { rate = 1, mark = "G", c = c });

問題は、追加したばかりのチェックボックスを実際にチェック/チェック解除できないことです。構造体定義でチェックボックスを使用せずに試してみましたが (空の datagridcheckboxcolumn のみ)、それも機能しません。私はデータグリッドを返すクラスでそれを作成しているので、実際にはxamlにアクセスできません。

どんな提案でも大歓迎です;)

4

1 に答える 1

1

バインディングを機能させるには、 structの代わりにclassを使用し(ここを参照)、 INotifyPropertyChangedインターフェイスを実装することをお勧めします。

何かのようなもの

public class TaxRateFromDatabase : INotifyPropertyChanged
        {
            private int _rate;
            public int Rate
            {
                get { return _rate; }
                set { _rate = value; OnPropertyChanged("Rate"); }
            }

            private string _mark;
            public string Mark
            {
                get { return _mark; }
                set { _mark = value; OnPropertyChanged("Mark"); }
            }

            private bool _isChecked;
            public bool IsChecked
            {
                get { return _isChecked; }
                set { _isChecked = value; OnPropertyChanged("IsChecked"); }
            }





            public event PropertyChangedEventHandler PropertyChanged;
            private void OnPropertyChanged(string propertyName)
            {
                if (PropertyChanged != null)
                    PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }

        }

そして例えば

DataGrid taxRateDataGrid = new DataGrid();
        DataGridTextColumn col0 = new DataGridTextColumn();
        DataGridTextColumn col1 = new DataGridTextColumn();
        DataGridCheckBoxColumn col2 = new DataGridCheckBoxColumn();


        taxRateDataGrid.Columns.Add(col0);
        taxRateDataGrid.Columns.Add(col1);
        taxRateDataGrid.Columns.Add(col2);

        col0.Binding = new Binding("Rate");
        col1.Binding = new Binding("Mark");
        col2.Binding = new Binding("IsChecked");

        col0.Header = "Stawka";
        col1.Header = "Oznaczenie";
        col2.Header = "Status";


        List<TaxRateFromDatabase> list = new List<TaxRateFromDatabase>();


        list.Add(new TaxRateFromDatabase { Rate = 1, Mark = "E", IsChecked = true });
        list.Add(new TaxRateFromDatabase { Rate = 23, Mark = "F", IsChecked = false });

        taxRateDataGrid.ItemsSource = list;
于 2012-09-04T12:18:16.167 に答える