2017-12-14 8 views
0

WPF에 익숙하지 않아서 Winforms에서 MVVM 패턴을 사용하려고했습니다. 단추를 클릭하면 API를 통해 msg를 검색하는 비동기 메서드가 시작되는 양식이 있습니다.MVVM on Winforms : 비활성화 된 단추를 끌 수 있습니다 (async/await 사용)

작업은 일부 UI 동작을 제어하는 ​​속성 인 내보기 모델에서 실행되고 있습니다. 뷰 모델은 Fody Weaver Property Changed를 통해 INotifyOnPropertyChanged를 구현하고 뷰 모델 자체를 DataSource로받는 BindingSource를가집니다.

BindingSource bsViewModel = new BindingSource(); 
bsViewModel.DataSource = this; // this being the view model the BindingSource lives in 

는 VM 속성이이 결함있는 경우를 제외하고 잘 작동 DataBinding.Add와 컨트롤의 속성()에 바인딩됩니다. 버튼 텍스트는 올바르게 업데이트되지만 버튼 위로 마우스를 가져 가면 (또는 버튼이 배치 된 UserControl에서 Refresh()를 호출 할 때만 버튼의 색상이 변경됩니다).

동료는 WinForms의 BindingSource, MVVM에서는 비동기 대기 대신 BackgroundWorker와 동일한 기술을 사용하고 있습니다. 그는 그 문제가 없습니다. 버튼이 제대로 사용 중지되고 사용 중지 된 경우 마우스 오버 효과가 표시되지 않습니다.

이 반쪽 비활성화 버튼의 원인은 무엇일까요?

disabled buttons have hover effect

+0

또한 문제가없는 Winforms에서 MVVM을 구현했습니다 ... 문제를 재현 할 수 있도록 작은 코드 예제를 게시 할 수 있습니다. . – Sievajet

답변

1

문제는 윈폼 자체에있다. 어쨌든 내가 알고있는 MVVM 패턴을 죽이지는 않지만 어쨌든 그것을 포기하고 싶었습니다.

배경 작업자를 사용하여 내 비동기 방법을 시도했습니다. 버튼 문제는 동일했습니다. 비동기 메서드 내에서/다른 스레드에서 뷰 모델 속성을 변경하는 경우에만 발생합니다.

또 다른 주목할 점은 뷰 모델 속성과 데이터 바인딩을 사용하여 가시성을 제어 할 수 없다는 것입니다. 사용 가능한 속성은 진행률보고를 통해 설정 한 경우에만 작동합니다. 그것은 멍청하지만 어쨌든 WPF를 배우고 싶습니다 ...