데이터 소스 속성에 바인딩 된 XAML 요소가 있고 데이터 소스가 더 빠르게 변경되면 사람의 눈이 볼 수있는 것처럼 보입니다. 또한 UI가 더 빠르게 그려지고 인간의 눈이 볼 수 있다고 가정합니다. 자원 낭비. 속성 변경이 UI 다시 그리기를 트리거하는 대신 플래그를 발생시킨 다음 속성이 변경된 경우 UI 다시 그리기를 트리거하는 타이머가 좋을까요? 또는 UI가 다시 그려지는 방법을 놓치고 있습니까?XAML 바인딩 UI 업데이트
답변
당신 다음
private object _property;
public object Property
{
get { return _property; }
set
{
if (_property != value)
{
_property = value;
Dispatcher.DelayInvoke("PropertyChanged_Property",(Action)(() =>
{
RaisePropertyChanged("Property");
}),TimeSpan.FromMilliseconds(500));
}
}
}
내가 ...
하지만 그것을 확실하지 좋아 어쩌면이 같은 속성 변경 이벤트를 발생의 delyed 호출 ...public static class DispatcherExtensions
{
private static Dictionary<string, DispatcherTimer> timers =
new Dictionary<string, DispatcherTimer>();
private static readonly object syncRoot = new object();
public static void DelayInvoke(this Dispatcher dispatcher, string namedInvocation,
Action action, TimeSpan delay,
DispatcherPriority priority = DispatcherPriority.Normal)
{
lock (syncRoot)
{
RemoveTimer(namedInvocation);
var timer = new DispatcherTimer(delay, priority, (s, e) => action(), dispatcher);
timer.Start();
timers.Add(namedInvocation, timer);
}
}
public static void CancelNamedInvocation(this Dispatcher dispatcher, string namedInvocation)
{
lock (syncRoot)
{
RemoveTimer(namedInvocation);
}
}
private static void RemoveTimer(string namedInvocation)
{
if (!timers.ContainsKey(namedInvocation)) return;
timers[namedInvocation].Stop();
timers.Remove(namedInvocation);
}
}
을 사용할 수
이 경우의 전형적인 패턴을 업데이트한다
private object _property;
public object Property
{
get { return _property; }
set
{
if (_property != value)
{
_property = value;
RaisePropertyChanged("Property");
}
}
}
로 재산 구현되어 사용자의 값이이 경우에 UI 업데이트를 트리거 타이머
변경된 경우에만 바인딩의 방법 가기. UI를 유창하게 유지하려면 약 40ms의 타이머 간격을 유지하십시오. 인수없이 RaisePropertyChanged()
를 호출
public class ViewModel
{
private Timer updateTimer;
public ViewModel()
{
updateTimer = new Timer();
updateTimer.Interval = 40;
updateTimer.Elapsed +=new ElapsedEventHandler(updateTimer_Elapsed);
updateTimer.Start();
}
private object _property;
public object Property
{
get { return _property; }
set
{
if (_property != value)
{
_property = value;
}
}
}
void updateTimer_Elapsed(object sender, ElapsedEventArgs e)
{
RaisePropertyChanged();
}
}
모든 바인딩을 새로 고치려면 UI를 강제로. 이것을 원하지 않는다면 플래그 나 레지스트리를 사용하여 어떤 속성을 업데이트해야하는지 표시 할 수 있습니다.
타이머가 도입되면 도움이되는 것보다 많은 피해가 발생하므로 해당 viewmodel 클래스가 진행 중입니다. 이벤트 처리기로 인해 루팅 될 수 있습니다. WPF가 당신을 위해 처리 할 수 있다고 생각하는 것을 처리하려고 시도하지 마십시오 – Dominik
나는 이것이 도움보다 많은 피해를 입었다는 것을 알지 못합니다. WPF는 항상 UI와 해당 업데이트를 처리합니다. 난 그냥 경과 타이머에 의해 속성 변경 표시를 제어하고 싶습니다. – Batuu
수동으로 처리해야하는 이벤트 핸들러를 추가 했으므로 슬프다. ViewModel에서 가비지 수집을 원한다. – Dominik
- 1. WPF UI 바인딩 용 데이터 소스 업데이트
- 2. 코드 바인딩 바인드 소스 변경시 UI 업데이트
- 3. XAML 인덱서 데이터 바인딩
- 4. 소스 바인딩 변경시 WPF 업데이트 UI
- 5. UI 다시 할당되는 ObservableCollection에 대한 바인딩 업데이트
- 6. XAML 스타일 바인딩
- 7. WPF/XAML : Image.Source 바인딩
- 8. XAML 중첩 바인딩 StringFormat
- 9. XAML 텍스트 바인딩
- 10. XAML 바인딩 그룹
- 11. 바인딩 XAML 요소 양방향
- 12. Xaml 명령에 바인딩
- 13. XAML 바인딩 문자열 연결
- 14. XAML ComboBox 속성에 바인딩
- 15. XAML 변환기에 바인딩
- 16. XAML 바인딩 속성
- 17. WPF 데이터 바인딩 - 템플릿에서 UI 컨트롤에 바인딩
- 18. WPF의 코드로 UI 업데이트
- 19. XAML 바인딩 : "전역"개체의 속성에 대한 바인딩
- 20. Metro UI XAML TextBlock Background
- 21. XAML 종속성 속성에 대한 바인딩
- 22. XAML 바인딩 코드가 작동하지 않습니다.
- 23. 데이터 XAML (멀티 웨이 바인딩?)
- 24. Windows Phone 7.1의 Xaml 바인딩
- 25. 실버 라이트 XAML 바인딩 진수
- 26. 런타임에 바인딩 된로드 됨 XAML
- 27. xaml 데이터 바인딩 및 탐색
- 28. XAML 코드의 데이터 바인딩 단순
- 29. Windows 8에서 XAML 템플릿 바인딩
- 30. IronRuby 및 XAML 데이터 바인딩
그리드입니까? 또는 전체 UI? –
데이터 소스가 INotifyPropertyChanged 이벤트를 발생시키는 경우 그리드가 이에 응답합니다. PropertyChanged를 자주 발생시키지 않는 타이머를 구현할 수 있습니까? 예. 500ms 후 속성이 변경되어 이벤트가 시작되지 않은 경우 이벤트를 시작합니다. – Michael