【问题标题】:Checkbox is not checked in DevExpress GridControl using wpf未使用 wpf 在 DevExpress GridControl 中选中复选框
【发布时间】:2013-07-22 20:36:51
【问题描述】:

我正在尝试处理 DevExpress GridControl Checkbox 列,但问题是当我在 XAML 代码中动态绑定复选框值时,它不能完美地工作 下面我为您提供我的演示项目代码:-

XAML 代码:-

<dxg:GridControl AutoPopulateColumns="True" HorizontalAlignment="Left"  Margin="0,40,0,0" Name="gridControl1" VerticalAlignment="Top" Height="318" Width="503">
            <dxg:GridControl.View>
                <dxg:TableView Name="tableView1" ShowTotalSummary="True" />
            </dxg:GridControl.View>
            <dxg:GridControl.Columns>
                <dxg:GridColumn DisplayMemberBinding="{Binding Path=EvenOdd}" Header="Even/Odd" />
                <dxg:GridColumn Name="PickColumn" Header="Pick" Width="30" 
                                    AllowColumnFiltering="False" AllowSorting="False">
                    <dxg:GridColumn.CellTemplate>
                        <DataTemplate>
                            <CheckBox IsChecked="{Binding Path=IsValid}"
                                          HorizontalAlignment="Center" VerticalAlignment="Center" >
                            </CheckBox>
                        </DataTemplate>
                    </dxg:GridColumn.CellTemplate>
                </dxg:GridColumn>
            </dxg:GridControl.Columns>
        </dxg:GridControl>

我的cs文件代码:-

public class ss
{
  public bool IsValid { get; set; }
  public string EvenOdd { get; set; }
}

代码背后:

    public List<ss> sList = new List<ss>();


    private void Window_Loaded(object sender, RoutedEventArgs e)
    {

        for (int i = 0; i < 10; i++)
        {

            if (i % 2 == 0)
            {
                sList.Add(new ss { IsValid = true, EvenOdd = "Even" });
            }
            else
            {
                sList.Add(new ss { IsValid = false, EvenOdd = "Odd" });
            }
        }

       gridControl1.ItemsSource = sList;
    }

【问题讨论】:

    标签: wpf checkbox devexpress gridcontrol


    【解决方案1】:
       xmlns:dxgcore="http://schemas.devexpress.com/winfx/2008/xaml/grid"
    
    
         <dxgcore:GridColumn Width="20"  
                             AllowEditing="True"  
                             Binding="{Binding Path=IsChecked, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"  
                             Header="R"  
                             Visible="{Binding CheckboxSelection}"  
                             VisibleIndex="6">  
                     <dxgcore:GridColumn.CellTemplate>  
                       <DataTemplate>  
                         <dxe:CheckEdit HorizontalAlignment="Center"  
                                 VerticalAlignment="Center"  
                                 Command="{Binding 
    Path=View.DataContext.IsCheckedCommand}"  
                                 CommandParameter="{Binding RowData.Row}"  
                                 IsChecked="{Binding RowData.Row.IsChecked, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"  
                                 IsEnabled="{Binding Path=View.DataContext.IsCheckBoxEnabled, UpdateSourceTrigger=PropertyChanged}" />  
                       </DataTemplate>  
                     </dxgcore:GridColumn.CellTemplate>  
                   </dxgcore:GridColumn>  
    

    和 Notifychanged 属性

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

    【讨论】:

      【解决方案2】:

      添加到 HighCore 的答案。如果您想编辑网格中的数据。

      ColumnBase.CellTemplate Property:

      • 要启用数据编辑,请使用 DevExpress Data Editors Library for WPF 附带的编辑器。编辑器的名称必须设置为 “PART_Editor”。
      • 标准控件只能在 CellTemplate 中用于显示目的。不允许修改数据。

      那么,

      xmlns:dxe="http://schemas.devexpress.com/winfx/2008/xaml/editors" 
      
      <dxg:GridColumn Name="PickColumn" 
                      Header="Pick" 
                      Width="30" 
                      AllowColumnFiltering="False" 
                      AllowSorting="False">
          <dxg:GridColumn.CellTemplate>
              <DataTemplate>
                  <dxe:CheckEdit x:Name="PART_Editor"
                                 EditValue="{Binding Path=Data.IsValid, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
              </DataTemplate>
          </dxg:GridColumn.CellTemplate>
      </dxg:GridColumn>
      

      您仍然需要使用 HighCore 的 INotifyPropertyChanged 实现。

      【讨论】:

      • Thnx @Willem 和 @HighCore !
      【解决方案3】:

      首先你需要更正CellTemplate内部的绑定:

      <CheckBox IsChecked="{Binding Path=RowData.Row.IsValid}"/>
      

      其次,你的数据项应该实现INotifyPropertyChanged

       public class ss:INotifyPropertyChanged
          {
              private bool _isValid;
              private string _evenOdd;
      
              public bool IsValid
              {
                  get { return _isValid; }
                  set
                  {
                      _isValid = value;
                      OnPropertyChanged("IsValid");
                  }
              }
      
              public string EvenOdd
              {
                  get { return _evenOdd; }
                  set
                  {
                      _evenOdd = value;
                      OnPropertyChanged("EvenOdd");
                  }
              }
      
              public event PropertyChangedEventHandler PropertyChanged;
      
              protected virtual void OnPropertyChanged(string propertyName)
              {
                  PropertyChangedEventHandler handler = PropertyChanged;
                  if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
              }
          }
      

      【讨论】:

        猜你喜欢
        • 2013-05-07
        • 1970-01-01
        • 1970-01-01
        • 2015-11-30
        • 2011-01-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-05
        相关资源
        最近更新 更多