수동

2013-05-24 3 views
0

나는이 DataGrid있는 일부 데이터 그리드의 요소를 업데이트 수동

public static DependencyProperty MinutesProperty = 
DependencyProperty.Register("Minutes", typeof(string), typeof(TimelineControl), 
new PropertyMetadata(OnMinutesChanged)); 

public string Minutes 
{ 
    get { return (string)GetValue(MinutesProperty); } 
    set { SetValue(MinutesProperty, value); } 
} 

private static void OnMinutesChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
{ 
    Console.WriteLine("foo bar"); 
} 
I에후기는 일부 행을 추가 :

TimeScale temp; 
temp = this.addEvent(temp, 23); 
temp = this.addEvent(temp, 24); 
temp = this.addEvent(temp, 25); 
temp = this.addEvent(temp, 26); 

dgTimeline.Items.Add(temp); 

private TimeScale addEvent(TimeScale temp, int time) 
{ 
    PropertyInfo propertyInfo = temp.GetType().GetProperty("Time" + (time/60)); 

    if (propertyInfo.GetValue(temp, null) != null) 
    { 
     if (propertyInfo.GetValue(temp, null).ToString().IndexOf((time % 60).ToString()) == -1) 
     { 
      propertyInfo.SetValue(temp, Convert.ChangeType(propertyInfo.GetValue(temp, null) + 
       "," + (time % 60), propertyInfo.PropertyType), null); 
     } 
    } 
    else 
    { 
     propertyInfo.SetValue(temp, Convert.ChangeType(time % 60, propertyInfo.PropertyType), null); 
    } 

    return temp; 
} 

모두가 지금까지 잘 작동의 OnMinutesChanged이 잘 유발되고 UI가 업데이트됩니다. 문제는 DataGrid에있는 항목을 업데이트하려고 시도하면 OnMinutesChanged이 트리거되지 않으며 UI가 업데이트되지 않는다는 것입니다.

나의 목표는 OnMinutesChanged으로 변경된 특정 요소의 UI를 수동으로 업데이트하는 것입니다. dgTimeline.Items.Refresh()을 호출하면 전체 표가 새로 고쳐지고 모든 것이 작동하고 OnMinutesChanged이 호출됩니다. 문제는이 격자가 매초마다 업데이트되므로 요소 수가 너무 많아 (쉽게 500 개 이상이므로) dgTimeline.Items.Refresh()을 호출하면 응용 프로그램이 거의 정지됩니다. 난 그냥 초당 3 요소의 UI를 업데이 트해야합니다, 모든 500, 그래서 내가 수동으로하고 싶어.

올바른 일을하고 있습니까? 그렇다면 그리드를 업데이트 할 때 OnMinutesChanged이 호출되지 않는 이유는 무엇입니까?

답변

2

DataGridbinding groups을 사용하여 전체 행의 유효성을 검사하고 속성 중 하나에 잘못된 값이 할당 된 경우 기본 객체의 잘못된 상태를 방지합니다. 이렇게하면 셀 내의 바인딩의 기본값 인 UpdateSourceTriggerExplicit으로 변경되므로 바인딩 개체에서 명시 적으로이 값을 PropertyChanged으로 설정하여 재정의 할 수 있습니다.

일반적으로 사용자가 행 편집을 완료하면 업데이트가 실행되지만 CellTemplate이 아닌 CellEditingTemplate을 사용하면 결코 편집 모드로 들어 가지 않습니다.

+0

그래서'bTemp.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;를 설정하면'OnMinutesChanged'가'dgTimeline.Items.Refresh()'를 호출하지 않고 실행됩니다. –

+0

@FredericoSchardong : 그래야합니다. –

+0

불행히도 그렇게하지 않습니다. –