Microsoft MVP성태의 닷넷 이야기
wpf의 ICommand 질문 입니다. [링크 복사], [링크+제목 복사]
조회: 12011
글쓴 사람
popo
홈페이지
첨부 파일
(연관된 글이 1개 있습니다.)

안녕하세요.

ICommand를 구현해서 특정 컨트롤에 Command처리를 하고 Execute()와 CanExecute() 메서드를 구현했을때

CanExecute Command 이벤트가 키보드와 마우스 Input이 감지 될때마다 매번 항상 발생 되는 것을 확인 할 수 있는데요

당연히 또 Execute Command가 실행 될 수 있는지 여부를 따질려면 매번 발생되는 것이 맞다고 생각하고 있습니다.

그런데 Command처리를 MVVM패턴으로

View에 Command바인딩 처리를 해놓고 ViewModel에 Execute()와 CanExecute()를 구현해 놓았을때

해당 View가 Close되고 더 이상 사용되지 않은 경우에도 매번 CanExecute Command 이벤트가 발생되는 것을 확인 할 수 있었습니다.

이 것이 여러개의 많은 Command가 사용되는 경우 메모리 누수 같은 영향을 끼치거나 CanExecute()안에 여러 개체를 참조하는 로직이 포함되어 있는 경우

심각한 문제가 될 수 있다고 생각하는데요..

이러한 상황 같은 경우는 어떻게 처리를 해야 하면 좋을지 질문 남겨 봅니다.

정리 하자면 MVVM패턴 사용시 해당 View가 제거 될때 ViewModel 정리 및 Command 이벤트 정리를 효과적으로 하려면 어떻게 하는 것이 좋은 것 인지 답변 부탁드립니다.


제가 테스트했던 파일 첨부 하겠습니다.

Window1이 닫힌 상태에서도 Window1ViewModel에 CanExecuteTestSendMailCommand가 매번 호출 되는 것을 확인했습니다.


[연관 글]






[최초 등록일: ]
[최종 수정일: 3/9/2016]


비밀번호

댓글 작성자
 



2016-03-09 03시03분
문답으로 풀어볼까요? ^^ 우선, Window1이 닫혔는데도 CanExecuteTestSendMailCommand가 발생하는 이유가 뭘까요? ^^ (참고로, 현재 예제가 GalaGalaSoft.MvvmLight를 사용해서 복잡한데, 간략하게 자신이 만든 ICommand로 구현해 보세요.)
정성태
2016-03-10 01시04분
[글쓴이] 답변 감사 드립니다.

처음엔 단순히 Command가 변경될때나 키보드의 KeyUp 이벤트, 마우스 Click이벤트가 발생될때 CommandManager.RequerySuggested 이벤트가 자동적으로 호출되어 CanExecute가 매번 발생 되는 것이라고만 생각 했었는데

이상하게 Window1이 닫혔는데도 CanExecute가 왜 매번 발생되는지 생각해보니 CommandManager.RequerySuggested가 static으로 되어 있는 것 을 확인했습니다.

그래서 매번 발생이 되는 것 같았습니다. (제가 정확하게 추측했는지는 모르겠네요..ㅠ)

그렇다면 명시적으로 CommandManager.RequerySuggested 이벤트가 제거가 되어야 하는데

ICommand의 CanExecuteChanged이벤트에 remove는 언제 호출이 되는 것인지 몰르겠습니다.

매번 여러 화면에서 명시적으로 window가 닫힐때 CommandManager에서 직접 제거하는 코드를 넣는 것은 또 아닌 것 같구요..

답변 부탁드립니다.
(예제의 window1에 버튼 Command는 GalaGalaSoft.MvvmLight와 상관 없이 직접 ICommand로 구현 되어 있는 DelegateCommand를 사용하고 있습니다.)
[guest]
2016-03-10 02시23분
이게 문제가 있군요. CanExecuteChanged는 일단 해제해 주어야 합니다. 아니면, 윈도우가 닫힐 때 명시적으로 DataContext 속성을 (Closed 이벤트 등의 시점에) null로 설정해 주어야 합니다. 어쨌든, CommandManager.RequerySuggested 와 DataContext != null인 상황이 맞물리면 그와 같이 Window 자원이 정상적으로 해제되지 않는 문제가 있습니다. (아마도, 내부적으로 복잡한 상호 참조 문제가 있는 듯 한데... 더 이상은 알 수 없군요.)

(그리고, 예제 코드는 간결하게 올려주실수록 좋습니다. 문제가 발생한 곳의 코드는 간단하다고 해도 처음 그 코드를 보는 사람들은 다른 코드가 방해될 수밖에 없습니다. 그래서, 최소한의 예제 코드를 올려달라고 부탁드리는 것입니다.)
정성태
2016-03-10 05시56분
[글쓴이] 답변 감사드립니다.

그렇다면 말씀해주신 "CommandManager.RequerySuggested 와 DataContext != null인 상황이 맞물리면 그와 같이 Window 자원이 정상적으로 해제되지 않는 문제가 있습니다."

이 부분은 .net의 버그로 보아야 하는 것인건가요..?ㅠ

첨부 예제를 최소한의 예제 코드로 올리지 못한점은 죄송합니다..
[guest]
2016-03-10 03시46분
그러게요... 버그라고 보는 것이 맞겠지요! 일단 다음의 글로 정리해 두었으니 참고하세요.

WPF - ICommand.CanExecuteChanged가 해제되지 않는 문제
; http://www.sysnet.pe.kr/2/0/10918
정성태

... [46]  47  48  49  50  51  52  53  54  55  56  57  58  59  60  ...
NoWriterDateCnt.TitleFile(s)
3695Bere...2/15/201612909호출당한 메서드가 호출한 메서드를 알 수 있는 방법이 일반적인 방법 말고도 있을까요? [2]
3693조영준2/11/201613589UWP 앱을 만들고 있습니다. 죄송하지만 몇 가지 질문 드립니다. [4]
3692후배2/8/201612593html/css/js를 이용한 winForm의 UI표현이 가능 한가요? [3]
3690김대석2/5/201611067문의 드립니다. [2]
3687허재영2/3/201612664web api 보안관련 질문입니다. [2]
3685조진우2/1/201612600메인 응용 프로그램에서 DLL을 실시간으로 접근하여 사용하는데 이것을 모니터링 할 수 있을 까요? [1]
3684나그네1/27/201611949안녕하세요..wcf 관련하여 질문있습니다. [4]파일 다운로드1
3683김태형1/25/201612242 안녕하세요 저작도서를 구매하려는데 한가지 문의 사항이 있어서 질문드립니다. [1]
3681이영균1/8/201614827IE브라우저 추가기능관리의 항목을 사용함으로 c#코드로 변경을 하려고 합니다. [8]
3680후배1/6/201615040추천할만한 소켓 라이브러리 있으신가요? [2]
3679초록물꼬기1/6/201613908Parallel.For 에서 동기화문제에 관한 질문입니다. [11]파일 다운로드1
3678김민우1/3/201612328IHS 오류에 대한 질문입니다. [2]파일 다운로드1
3677초록색우산12/31/201513915HTTP 통신 - WebClient 이용시 한글깨짐 현상 발생 [2]
3676서정열12/31/201512765안녕하세요 WebService SoapExtensionImporter 에 대해서 질문드립니다. [3]
3675차가워12/30/201511820윈폼, 폼인폼 상황에서 하위컨트롤 포커스 문제 [1]
3673Sung...12/24/201512870UWP예외 발생 : 'System.Runtime.InteropServices.COMException'(mscorlib.ni.dll) 해결방법 [2]
3672Sung...12/23/201512124global::System.Diagnostics.Debugger.Break();가 노랗게 표시될시 [2]
3671이상준12/22/201516290한글 키보드 입력에 대해서 질문이 있습니다. [3]
3670Sung...12/18/201513061UWP 주기적으로 신호를 보내고 클라이언트에서 신호가 오면 받는 프로그램을 하려고 합니다. [5]
3669다비드12/18/201511350인터넷 임시파일 삭제 관련 질문. [1]
3668김치사발면12/16/201510806템플릿이 자꾸 초기화? 되버리네요 [1]
3667김치사발면12/15/201510727템플릿 설정 추가 질문 [1]파일 다운로드1
3666노태현12/15/201510133사용자별로 권한을 주고 볼 수 있는 데이터를 제한하려면 어떤 방법으로 접근하는게 좋을까요? [2]
3665김치사발면12/14/201513223C# 템플릿 설정이 이상해요ㅜㅜ [3]파일 다운로드1
3664KuLu12/10/201510522멀정하던 사이트 중 일부메뉴가 응답없음이 되어버립니다. [3]
3663Sung...12/10/201511905UWP 서버 프로그래밍 작업 중 [5]
... [46]  47  48  49  50  51  52  53  54  55  56  57  58  59  60  ...