1

UserControl1 に UserControl1 と別の UserControl2 があります。User Control2 には、リストビューがあります。

DB から DataSet を取得しており、「MyTable」をリストビューにバインドしたいと考えています。だから私はコードビハインドで以下に示すようにしました。

UserControl1.UserControl2.lstview.ItemsSource = DataSet.Tables["MyTable"].DefaultView;

上記の方法は有効です。しかし問題は、1 つの列にセル テンプレートとしてチェックボックスがあることです。

 <GridViewColumn.CellTemplate>
      <DataTemplate>
        <CheckBox IsChecked="{Binding isok, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Width="20" Height="15" />
      </DataTemplate>
 </GridViewColumn.CellTemplate>

[isok は MyTable のビット型カラム]

しかし、コードを使用して isok 列を更新すると、UI に反映されません。つまり、チェックボックスがチェックされていないか、チェックされていません。

そのため、Binding Mode を 2 way に設定していないことが問題である可能性があります。ということで、下図のようにしました。しかし、以下のようにしたとき、リストビューにデータが表示されません!!!

ここで何が問題になる可能性がありますか???

Binding b = new Binding("DataSet.Tables");
b.Source = DataSet.Tables["MyTable"].DefaultView;
b.Mode = BindingMode.TwoWay;
UserControl1.UserControl2.lstview.SetBinding(ListView.ItemsSourceProperty, b);

以下に示すように、列の値を更新しています

  DataView dv = (DataView)lstview.ItemsSource;
 foreach (DataRow dr in dv.Rows)
        {
            dr["isok"] = isselected;
        } 

NB:ここではMVVMはありません

4

1 に答える 1

0

DataRow は INotifyPropertyChanged を実装していないため、プロパティを変更しても UI に通知されません。

代わりにユーザー DataRowView:

http://msdn.microsoft.com/en-us/library/system.data.datarowview%28v=vs.100%29.aspx

編集:

foreach (DataRowView tempRowView in myDataTable.DefaultView)
{
  ...
}

myDataTable.DefaultView の項目は、DataRowView に直接キャストできます。

于 2013-10-30T07:37:12.740 に答える