Microsoft MVP성태의 닷넷 이야기
[답변]: 예제 프로젝트 첨부합니다. [링크 복사], [링크+제목 복사]
조회: 10125
글쓴 사람
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)
5129진우2/23/201910183닷넷 32비트 기반에서 메모리 부족으로 프로그램이 죽는경우 문의 [2]
5128게스트2/23/20197857안녕하세요. 초보개발자입니다. [3]파일 다운로드1
5127c#2/20/20196898책에 예제 문의드립니다. [2]
5125게스트2/19/20196985delegate를 활용한 event 를 적절히 불러오고 싶습니다. [2]
5124정근화2/12/20196861윈도우 서버2003 환경 오류 [2]
5123김주현2/8/20196926MS LUIS 에 대한 소개 하실 계획이 있으신가요? [1]
5122jaka...2/1/20198781Clickonce 배포 후 Command 실행 [2]파일 다운로드1
5121엔벌이1/31/20198242C# DataGridView의 MDB파일 함수? ArrayList? [1]파일 다운로드1
5120임우진1/30/20198743웹에서 응용프로그램 바로 실행하기 관련 브라우저에서 파라미터가 넘어오지 않습니다.ㅜㅜ [2]
5119guest1/29/201910128교재에 오탈자 있어 알려드리려 합니다 [1]
5118WPF꿈...1/26/20198076GetHashCode 메서드에 대해서 [1]
5117하주형1/25/20198707List<int>에 대한 이해가 잘안됩니다. [5]
5116게스트1/24/20197483asp.net 관련 gridview webform 질문 드립니다. [1]파일 다운로드1
5115Soul...1/24/20197647투명 패널 질문드립니다. [2]
5114박현일1/20/20197997WPF DataContext 관련 초보 질문을 드려봅니다.^^ [5]
5113하주형1/20/20197256안녕하세요 시작하세요 C# 인코딩관련 질문드립니다. [1]
5112손성배1/19/201916217안녕하세요 cp949 인스톨시 오류입니다... 너무 힘들어요 [5]
5111게스트1/10/20197879암호화 라이센스 관련 문의 드립니다. [1]
5110WPF꿈...1/9/20197524Thread Abort 함수 사용시 [2]
5109닷넷개발1/9/20197496thread 관련 질문 예제.. [2]파일 다운로드1
5108닷넷개발1/9/20198639thread 관련 질문 드립니다.. [4]
5107우코아1/4/201911234WPF에서 로딩중 이미지를 구현 - Project [5]파일 다운로드1
5106우코아1/3/20198887WPF에서 로딩중 이미지를 구현 - Source [1]
5104우코아1/1/201910151WPF에서 로딩중 이미지를 구현 [4]
5103이혜성12/31/20181073532bit .net 으로 만들어진 dll파일 [5]
5102돌고래12/18/20189499자료구조와 알고리즘 도서 관련 질문입니다. [4]
... 16  17  18  19  20  21  22  23  24  25  26  27  28  29  [30]  ...