C#WPF TwoWay CheckBox绑定不更新

时间:2015-11-16 19:12:36

标签: c# wpf datagrid

计算器!

从我的代码开始:

XAML

<DataGrid Margin="25,112,25,10" Name="datGrid" RowHeight="30"
        ColumnWidth="150" BorderThickness="1" 
        Style="{StaticResource AzureDataGrid}" IsReadOnly="False"
        AutoGenerateColumns="False">
       <DataGrid.Columns>
           <DataGridTemplateColumn>
               <DataGridTemplateColumn.HeaderTemplate>
                   <DataTemplate>
                       <CheckBox Content="CREATE" Name="headerCheckBox" 
                           FontWeight="Bold" Width="Auto" 
                           Checked="headerCheckBox_Checked"/>
                   </DataTemplate>
               </DataGridTemplateColumn.HeaderTemplate>
               <DataGridTemplateColumn.CellTemplate>
                   <DataTemplate>
                       <CheckBox IsChecked="{Binding Path=IsChecked, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
                   </DataTemplate>
               </DataGridTemplateColumn.CellTemplate>
               <DataGridTemplateColumn.CellStyle>
                   <Style TargetType="DataGridCell">
                       <Setter Property="HorizontalAlignment"  Value="Center"/>
                   </Style>
               </DataGridTemplateColumn.CellStyle>
           </DataGridTemplateColumn>
       <DataGridTextColumn Header="Username" Binding="{Binding Path=Username}"/>
       <DataGridTextColumn Header="First Name" Binding="{Binding Path=FirstName}"/>
       <DataGridTextColumn Header="Last Name" Binding="{Binding Path=LastName}"/>
       <DataGridTextColumn Header="Email" Binding="{Binding Path=Email}"/>
   </DataGrid.Columns>

</DataGrid>

和C#

public partial class MainWindow : Window
{
    ObservableCollection<MyData> MyItems = new ObservableCollection<MyData>();

    public MainWindow()
    {
        datGrid.ItemsSource = MyItems;
        MyItems.Add(new MyData { IsChecked = false, Username = "apetecca", FirstName = "Anthony", LastName = "Petecca", Email = "apetecca@email.com"});
        MyItems.Add(new MyData { IsChecked = true, Username = "jhalls", FirstName = "Jake", LastName = "Halls", Email = "jhalls@email.com" });

    }

    public class MyData
    {
        public bool IsChecked { get; set; }
        public string Username { get; set; } 
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Email { get; set; }
    }

    private void headerCheckBox_Checked(object sender, RoutedEventArgs e)
    {
        foreach (var item in MyItems)
        {
            item.IsChecked = true;
        }
    }

当我点击headerCheckBox进行检查时,我已经观察了foreach循环中的变量,看到它正在将项目从fal​​se更改为true但是在DataGrid上没有直观显示。但是,如果我手动选中或取消选中这些框,则在进行该循环时会正确显示。循环正确设置值但不更改GUI显示。

我在网上看到的所有内容都表明它与TwoWay模式和UpdateSourceTrigger有关。这两个都已设定,我似乎无法在这些上找到任何其他内容。

非常感谢任何帮助!

编辑 -

我也试过改变我的课程看起来像这样

public class MyData
{
    private bool _isChecked;
    public bool IsChecked
    {
        get { return _isChecked; }
        set 
        { 
            _isChecked = value;
            OnPropertyChanged("IsChecked");
        }
    }
    public string Username { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }

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

    public event PropertyChangedEventHandler PropertyChanged;
}

这也没有解决它。

1 个答案:

答案 0 :(得分:2)

实施INotifyPropertyChanged,然后让您的属性引发事件以实现此目的。

类似的东西:

public class MyData : INotifyPropertyChanged
{
    private bool isChecked;
    public bool IsChecked 
    { 
        get { return isChecked; } 
        set
        {
           if (isChecked != value)
           {
              isChecked = value;
              OnPropertyChanged("IsChecked");
           }
    }
    protected void OnPropertyChanged(string name)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(name));
        }
    }
}