2012-07-19 4 views
5

I 개념의 다음과 같은 증거가 있습니다이것은 WPF Datagrid 버그입니까?

XAML 창 : 뒤에

<Window x:Class="WpfApplication1.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525"> 

<DataGrid ItemsSource="{Binding Items}" AutoGenerateColumns="False" > 
    <DataGrid.Columns> 
     <DataGridTextColumn Binding="{Binding Name}" /> 
     <DataGridTemplateColumn > 
      <DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <CheckBox IsChecked="{Binding Mode=TwoWay, Path=Enabled}" /> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate> 
     </DataGridTemplateColumn> 
    </DataGrid.Columns> 
</DataGrid> 
</Window> 

코드 :

using System.Collections.ObjectModel; 
using System.Windows; 

namespace WpfApplication1 
{ 
public partial class MainWindow : Window 
{ 
    public ObservableCollection<Data> Items { get; private set; } 

    public MainWindow() 
    { 
     InitializeComponent(); 
     this.Items = new ObservableCollection<Data>(); 
     this.DataContext = this; 
     for (int index = 0; index < 30; index++) 
     { 
      this.Items.Add(new Data() {Enabled = true }); 
     } 
    } 
} 

public class Data 
{ 
    public bool Enabled { get; set; } 
} 
} 

이 응용 프로그램을 실행 상단에 약간의 상자를 선택 취소, 아래로 스크롤, 약간의 변경을 상자를 다시 열어 위로 스크롤하십시오. 확인을 다시 한 번 확인합니다.

내가 누락되었거나 Microsoft에 버그를 기입해야합니까?

EDIT : 답장을 보내 주셔서 감사합니다. INotify 또는 Checkbox와 관련이 없으며, TextBox와 동일한 작업이 수행됩니다. 스크롤 한 후 확인란을 클릭하고 일부만 선택을 취소하고 아래로 스크롤하고 위로 스크롤 한 다음 다시 확인해야 이벤트를 수행 할 필요가 없습니다.

<DataGrid ItemsSource="{Binding Items}" AutoGenerateColumns="False" > 
    <DataGrid.Columns> 
     <DataGridTemplateColumn > 
      <DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <StackPanel Orientation="Horizontal"> 
         <CheckBox IsChecked="{Binding Mode=TwoWay, Path=Enabled}" /> 
         <TextBox Text="{Binding Text}" /> 
        </StackPanel> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate> 
     </DataGridTemplateColumn> 
    </DataGrid.Columns> 
</DataGrid> 
</Window> 

그리고 뒤에있는 코드 :이 VirtualRows이 어디 여부를 작업의 예상 방법이 아니기 때문에

using System.Collections.ObjectModel; 
using System.ComponentModel; 
using System.Windows; 

namespace WpfApplication1 
{ 
public partial class MainWindow : Window 
{ 
    public ObservableCollection<Data> Items { get; private set; } 

    public MainWindow() 
    { 
     InitializeComponent(); 
     this.Items = new ObservableCollection<Data>(); 
     this.DataContext = this; 
     for (int index = 0; index < 30; index++) 
     { 
      this.Items.Add(new Data() { Enabled = true, Text = index.ToString() }); 
     } 
    } 
} 

public class Data : INotifyPropertyChanged 
{ 
    private bool _enabled; 
    public bool Enabled 
    { 
     get { return _enabled; } 
     set 
     { 
      if (value != _enabled) 
      { 
       _enabled = value; 
       this.OnPropertyChanged("Enabled"); 
      } 
     } 
    } 

    private string _text; 
    public string Text 
    { 
     get { return _text; } 
     set 
     { 
      if (value != _text) 
      { 
       _text = value; 
       this.OnPropertyChanged("Text"); 
      } 
     } 
    } 

    #region INotifyPropertyChanged Members 

    public event PropertyChangedEventHandler PropertyChanged; 

    protected virtual void OnPropertyChanged(string name) 
    { 
     if (this.PropertyChanged != null) 
     { 
      this.PropertyChanged(this, new PropertyChangedEventArgs(name)); 
     } 
    } 

    #endregion 
} 
} 
+1

'Data'가'INotifyPropertyChanged'에서 상속 받고 속성 변경 알림을 사용하면 결과가 바뀌나요? – Rachel

+0

재활용을 끄십시오. 세트가 호출 되나요? UpdateSourceTrigger = "PropertyChanged"가 아닌 경우 레이첼이 말한 것처럼 – Paparazzi

+0

나는 레이첼이 제안한 것을 시도 할 것이다. – ecMode

답변

1

마지막으로 나는 마이크로 소프트에서 결함을 입력 한이 코드를 확인 익숙한.

here

6

이 문제 버그 보고서는 재활용 관련이 없습니다. 실제로 재활용을 비활성화하면 실제 문제가 숨겨집니다. Data 개체 속성은 업데이트되지 않습니다. Enabled 또는 Text 세터에 중단 점을 설정하면 텍스트를 변경하거나 상자를 선택/선택 취소 할 때 아무 것도 나타나지 않습니다. 뒤로 스크롤하면 속성이 객체에서 다시 읽히고 변경되지 않았으므로 Enabled 속성과 일치하도록 확인란이 올바르게 업데이트됩니다.

DataGrid은 기본적으로 표시 모드의 모든 행을 가지며 사용자가 필요한 경우 현재 선택된 행에서 편집 모드로 전환합니다. 사용자가 전체 행의 유효성을 검사 할 때까지 값은 커밋되지 않습니다.

장면 뒤에서 암시 적으로 BindingGroup이 전체 행에 대해 생성되어 모든 바인딩을 효과적으로 UpdateSourceTrigger.Explicit으로 설정합니다. 이 바인딩 그룹은 사용자가 행 편집을 완료하면 커밋됩니다. 귀하의 경우에는 BeginEdit이 없기 때문에 CommitEdit이 없으며 값이 업데이트되지 않습니다.

  • 를 사용하여 다른 컨트롤의 행동이 "편집 모드로 전환을"이없는, 그런 ListView 등 :

    당신은 여기에 몇 가지 솔루션이있다.

  • 모든 바인딩마다 UpdateSourceTrigger ~ PropertyChanged 또는 LostFocus을 입력하십시오.
  • 사용자가 눈금을 사용하여 DataGrid 동작을 따르는 방식을 변경합니다.
관련 문제