Microsoft MVP성태의 닷넷 이야기
[답변]: 예제 프로젝트 첨부합니다. [링크 복사], [링크+제목 복사]
조회: 10119
글쓴 사람
ho (furho27 at gmail.com)
홈페이지
첨부 파일
부모글 보이기/감추기

안녕하세요 성태님
비밀번호를 통일했다 생각했는데
부모글 작성 시 엉뚱한 비밀번호를 입력해서인지 수정을 할 수 없어서
답변으로 파일을 첨부합니다.
부모글에 간단히 작성한 코드를 기반으로
간단히 프로젝트를 구성하여 첨부하오니 참고 바랍니다.








[최초 등록일: ]
[최종 수정일: 11/17/2017]


비밀번호

댓글 작성자
 



2017-11-16 03시53분
소스까지 올려주셨는데, 제가 정답을 못 드리게 되는군요. 일단, 데이터 바인딩 오류도 없는 걸로 봐서 의도하신 대로 잘 코딩하신 것 같습니다. UI에도 잘 반영이 되는 IsChecked 속성이 그것과 데이터바인딩된 IsChk에 반영되지 원인은 저도 모르겠습니다.

어쨌든, 이런 경우에 문제를 해결해야 하니 최대한 자연스럽게 하기 위해 다음과 같은 식으로 수정해 봤습니다.

1. CFile의 IsChk 속성에 대해 INotifyPropertyChanged 알림 구현
2. DataGridChkBoxColumn의 Checked DP에 대해 OnCheckedProprtyChanged에서 데이터그리드에 반영된 CFile 목록의 값을 직접 코드로 변경
3. dataGridChkCellStyle의 ControlTemplate.Triggers 노드는 제거

본래 원하는 바가 아니지만, 일단 제 수준에서 할 수 있는 것은 이 정도인 것 같습니다. 좀 더 WPF 잘 아시는 분이 정답을 주면 좋겠군요.

(제가 수정한 코드는 이 글의 첨부파일로 등록된 2번째 DataGridChkCell.zip 파일에 있습니다.)
정성태
2017-11-17 02시15분
[이성환] 안녕하세요. 큰 도움은 못 되겠지만 제가 간단히 살펴본 내용을 잠깐 말씀 드릴까합니다.

먼저 위 동작에서 바인딩된 VM의 property 에 setter 가 호출되지 않는 원인은
template 내부에서 사용하는 trigger 때문으로 추정되는데요.
template 내부에서 Trigger가 호출되면 ParentTemplateTrigger가 일시적으로 해당 DP의 기존 Binding을 해제하고 강제로 값할당을 수행하게 됩니다.
따라서 Binding 이 해제되기 때문에 VM의 property setter는 호출되지 않습니다. 물론 Trigger 가 setter 호출 이전 원래 값으로 돌아갈 때 Binding은 복구 됩니다.
(근데 저도 내부 구현을 본 게 아니라 이게 정확한 지는 모르겠네요. 어디선가 읽은 기억이 있는데 출처를 못 찾겠습니다. 혹은 제 기억이 잘못 되었을 수 있습니다.)

그래서 개인적으로는 Trigger를 통해 VM을 핸들링하는 것은 의도하지 않은 동작을 야기할 수 있어어 피하는 편입니다.

질문하신 IsChk 에 대한 핸들링은 Trigger 외부에서 Binding을 통해 하는 것이 좋을 듯 합니다.

따라서 위에서 의도하신 체크박스 처리는 다른 방법으로 하는 것이 더 나아 보입니다.

굳이 방법을 떠올려보자면
1. DataGrid에 별도의 Behavior를 붙여서 code 로 조작한다.
2. DataGrid의 VM 혹은 ItemsSource에 접근 가능한 VM위치에 전제 선택 property 를 추가하고 헤더와 Binding 한 다음 이 property에서 직접 code로 조작한다.

정도가 될 거 같군요.

역시... 써놓고 보니 도움은 안 된 것 같네요...;ㅅ;
[guest]
2017-11-17 02시57분
[ho] 제가 잘 알지 못해서겠지만 신기하고 이상한것 같습니다;
아무래도 바인딩에 대하여 좀더 알아봐야 할 것 같습니다.
몇 가지 테스트를 해봤는데 컨트롤의 특정 속성에 바인딩을 하고
컨트롤의 Style.Triggers를 이용해 데이터 트리거를 구성하였습니다.
데이터 트리거의 조건이 만족하면 바인딩된 특정 속성의 값을 변경하였는데
이번엔 그 속성의 값도 변경이 되지를 않았습니다.
(- VM에 정의된 속성도 변화가 없었습니다.)
제가 첨부한 예제 프로젝트의 경우
템플릿에 체크박스가 있어 타깃명으로 하여 체크박스의 속성에 접근을 한 것 이었다면
위의 경우는 컨트롤 자체에 접근을 한 부분이었습니다.
테스트한 내용으로 생각을 해보면
컨트롤의 속성에 바인딩을 한 후엔 트리거를 통해 속성 접근이 불가하고
템플릿 자식으로 추가된 컨트롤의 경우 트리거를 통해 속성 접근은 가능하지만
바인딩된 VM의 속성에는 반영이 되지 않는다고 보면 될것 같습니다.
코드에서 속성을 통해 변경하면 컨트롤과 VM의 속성에도 제대로 반영이 되는데
트리거를 통해선 제약이 있단 부분이 좀 웃기고
무엇보다 XAML에서도 접근하는 부분에 따라 다르게 접근한단게 이상한 것 같습니다.
확인 감사드립니다.
[guest]
2017-11-17 03시07분
[ho] @이성환) 감사합니다. 템플릿 내부 트리거에 그런 부분이 있었군요
트리거를 통해서 VM에 접근하는 것은 지양해야겠습니다.
성환님 말씀처럼 현재에선 Behaviors를 통해 처리를 해야할 것 같습니다.
[guest]

... 16  17  18  19  20  21  22  23  [24]  25  26  27  28  29  30  ...
NoWriterDateCnt.TitleFile(s)
5317kskk...4/7/20209032OpenCV 이용 해상도 설정 질문 입니다.. [3]
5316윤현수4/7/20206256pipe 비동기방식 질문 [1]파일 다운로드1
53154/6/20206922dll파일 로드 원리? 부분에서 도움받고싶습니다. [3]
5314강성욱3/31/20208825메서드 내에서 await 2번 등장할 때의 이해 [11]파일 다운로드1
5313강성욱3/27/20206631await 2번 [1]
53121a2a...3/20/20206410Re raw data write 질문 관련 [1]파일 다운로드1
53111a2a...3/20/20207216Raw data write 관련 질문 [1]파일 다운로드1
5310아스파넬3/15/202072431초에 5회 함수호출 제한 관련 질문입니다. [1]
5309하태3/11/20209122안녕하십니까. c# Winform UI 질문드리겠습니다! [3]파일 다운로드1
5308질문3/9/20207924Window XP SP3 32bit 환경(Window Update 모두 완료)에서 .Net Framework 4.0.3 으로 빌드된 .dll 파일 gacutil.exe 등록 관련 문의 [5]
5306개발자3/9/20206777C#을 통해 인터넷 접속 가능한 이더넷을 선택할 수 있는지요? [1]
5305JaeS...3/9/20206467RAW파일 생성 질문드립니다 [8]파일 다운로드1
5303궁금하당2/27/20208762C#에서 C++ DLL읽기 (아래 글쓴이) [1]
5302궁금하당2/27/202010846C#에서 C++ DLL호출 ('PInvokeStackImbalance') [4]파일 다운로드1
5301질문합니...2/27/20206328소켓 대량 데이터 디자인 문의 [1]
5300nals...2/27/20206956vs2013에서 BinaryFormatter Serialize 후 vs2015에서 Deserialize시 예외 발생 [3]파일 다운로드1
5298질문2/26/20208340.lic 파일에 대해 질문 있습니다. [9]
5297임한승2/26/20205907vs2013에서 BinaryFormatter Serialize 후 vs2015에서 Deserialize시 예외 발생 건 [1]파일 다운로드1
5295나그네2/25/20207333클라이언트 PC 정보 조회관련.. [2]
5294닷넷초보ㅠ2/25/20207314윈폼으로 socket통신프로그램 만든후 release로 디버깅한 실행파일을 다른컴퓨터에서 실행할때 반응이없어요 [1]
5293탱코2/21/20207210검색을 하고 싶은데 어떻게 검색을 해야 할 지 모르겠습니다. [1]
5292아부리2/19/20207124XingApiNet 관련 질문 [3]
5291지현명2/15/20207856JsonConvert.Serialize 하고 Deserialize 할때 간헐적으로 한글 깨짐 현상 문의 합니다. [3]
5290베도빈2/15/20207201직접 제작한 사용자 정의 콘트롤 DLL, 실행파일에 포함시켜 배포할 수 있을까요? [1]
5288김성배2/14/20207616c# 참조추가 기능에서 DirectX 참조가 보이지 않아요.. DircetX 11 은 설치 되어 있습니다. [1]
5287C# 초...2/14/20206622프로그램 실행 질문 드립니다. [4]파일 다운로드1
... 16  17  18  19  20  21  22  23  [24]  25  26  27  28  29  30  ...