定义一个数据绑定的datagrid,用来呈现数据,其中第二列是模板列,要求可以双向绑定
checkbox
<DataGrid x:Name="dataGrid" Grid.Row="0" ItemsSource="{Binding}" AutoGenerateColumns="False">
            <DataGrid.Columns>
                <DataGridTextColumn Header="AA" Binding="{Binding AA,Mode=TwoWay}" />
                <DataGridTemplateColumn Header="BB">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <CheckBox IsChecked="{Binding BB, Mode=TwoWay}" />
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
            </DataGrid.Columns>
        </DataGrid>绑定的数据源ObservableCollection<class1> bindingData = new ObservableCollection<class1>();public class class1
    {
        public string AA{get;set;}
        public bool BB { get; set; }
    }
public void InitDataBinding()
        {
            class1 a = new class1();
            a.AA = "aaaaa";
            a.BB = true;            bindingData.Add(a);
        }//绑定,初始化
dataGrid.ItemsSource = bindingData;wpf双向绑定

解决方案 »

  1.   

    此处我想询问的是,使用模板列,如何双向数据绑定上面的效果就是,当改变checkbox,可以改变数据源的值必须使用模板列谢谢大家
      

  2.   

    你页面所在的类实现了INotifyPropertyChanged 没?
      

  3.   

    http://bbs.csdn.net/topics/390603450
    这个帖子问的同样问题?
    你的实体类需要实现INotifyPropertyChanged 接口
    绑定的msdn你需要仔细阅读以下 呵呵
      

  4.   

    class1实现INotifyPropertyChanged 接口
    然后BB的set方法里面抛事件出来public class TestObject : INotifyPropertyChanged  
        {  
      
            private bool  _bb;  
      
            public bool BB{ get { return this._bb; } set { this._bb= value; OnPropertyChanged("BB"); } }  
            public event PropertyChangedEventHandler PropertyChanged;  
      
            void OnPropertyChanged(string name)  
            {  
                if (PropertyChanged != null)  
                    this.PropertyChanged(this, new PropertyChangedEventArgs(name));  
            }  
      
        }  
      

  5.   


    这个貌似不行吧,如果没有使用datagrid模板列,怎么样都可以,如果使用了,貌似ui的数据更新不到数据源的,双向绑定的格式是mode = twoway;默认也是这样的方式,不知道为什么不行,
      

  6.   


    这个貌似不行吧,如果没有使用datagrid模板列,怎么样都可以,如果使用了,貌似ui的数据更新不到数据源的,双向绑定的格式是mode = twoway;默认也是这样的方式,不知道为什么不行,
    模板列也是一样的 楼主自己慢慢试试吧
      

  7.   


    这个貌似不行吧,如果没有使用datagrid模板列,怎么样都可以,如果使用了,貌似ui的数据更新不到数据源的,双向绑定的格式是mode = twoway;默认也是这样的方式,不知道为什么不行,
    模板列也是一样的 楼主自己慢慢试试吧
    这个真心不行,第一列是可以的,没有使用模板列那个.
    我试过了,情况是这样的:
    第一列修改,可以;
    两列都修改,可以;
    只第二列修改,不可以;
      

  8.   

    上面的截图,我把check的勾去掉,然后看数据源,发现还是true;
      

  9.   


    <StackPanel>
            <TextBlock x:Name="ShowBBValue" Text="{Binding BB}" />
            <DataGrid x:Name="dataGrid" Grid.Row="0" ItemsSource="{Binding}" AutoGenerateColumns="False">
                <DataGrid.Columns>
                    <DataGridTextColumn Header="AA" Binding="{Binding AA,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" />
                    <DataGridTemplateColumn Header="BB">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <CheckBox IsChecked="{Binding BB, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" />
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                </DataGrid.Columns>
            </DataGrid>
        </StackPanel>public partial class MainWindow : Window
        {
            class1 a = new class1();
            ObservableCollection<class1> bindingData = new ObservableCollection<class1>();
            public MainWindow()
            {
                InitializeComponent();
                InitDataBinding();
            }        void InitDataBinding()
            {
                a.AA = "aaaaa";
                a.BB = true;
                bindingData.Add(a);
                ShowBBValue.DataContext = this.a;
                dataGrid.ItemsSource = bindingData;
            }    }    
     
        public class class1 : INotifyPropertyChanged  
        {  
       
            private bool  _bb;
            private string _aa;        public string AA
            {
                get { return _aa; }
                set { this._aa= value; OnPropertyChanged("AA"); }
            }
            
            public bool BB
            { 
                get { return this._bb; } 
                set 
                { 
                    this._bb= value; 
                    OnPropertyChanged("BB"); 
                } 
            }  
            public event PropertyChangedEventHandler PropertyChanged;  
       
            void OnPropertyChanged(string name)  
            {  
                if (PropertyChanged != null)  
                    this.PropertyChanged(this, new PropertyChangedEventArgs(name));  
            }  
       
        }  
    直接给你写了个例子 你看看吧
      

  10.   

    哈哈,太感谢你了,太负责任了.谢谢
    知道我错在哪里了,我没有写上这句,UpdateSourceTrigger=PropertyChanged
    不写这句貌似就不可以ui到源更新,呵呵,还是理解不深刻啊...