【问题标题】:C# WPF TwoWay CheckBox Binding not updatingC# WPF TwoWay CheckBox Binding 未更新
【发布时间】:2015-11-16 19:12:35
【问题描述】:

堆栈溢出!

从我的代码开始:

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 循环中的变量,发现它正在将项目从 false 更改为 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;
}

这也没有解决。

【问题讨论】:

  • MyData 类中实现INotifyPropertyChanged 怎么样?这是每个 WPF-er 都应该知道的非常基本的事情。
  • 哇。这就是我所要做的就是添加:INotifyPropertyChanged 到 MyData。我将不得不阅读这一点,因为我对 WPF 和 C# 还是很陌生。谢谢!!! :]
  • 好吧,你需要用你的所有属性做所有无聊的事情(否则你可能会遇到类似的问题),但你明白了:-)

标签: c# wpf datagrid


【解决方案1】:

实现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));
        }
    }
}

【讨论】:

    猜你喜欢
    • 2012-05-12
    • 2013-04-12
    • 1970-01-01
    • 2011-07-30
    • 1970-01-01
    • 2010-12-24
    • 2012-10-26
    • 2011-04-03
    • 1970-01-01
    相关资源
    最近更新 更多