Microsoft MVP성태의 닷넷 이야기
[답변]: 예제 프로젝트 첨부합니다. [링크 복사], [링크+제목 복사]
조회: 10095
글쓴 사람
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)
5397나그네10/15/20206070.net Core 3.1 에서 Entity Framework 와 ADO.NET 선택에 관해 여쭤봅니다. [2]
5396여정욱10/15/20206148CLR heap 관련 질문 2 [2]
5395여정욱10/14/20207928CLR heap 관련 질문 [2]
5394진우10/12/202011277닷넷코어 (닷넷5) winform wpf는 리눅스/맥에서도 가능한가요? [2]
5393김세용9/23/20207789C#에서 대량의 클래스를 빠르게 생성하는 방법이 없을까요? [6]
5392전경호9/22/20207461WPF에서 WindowsFormsHost의 메모리 누수 문제 때문에 문의드립니다. [1]파일 다운로드1
5391민성9/22/20206729안녕하세요 항상 감사드립니다. 하나 질문 드리겠습니다. [1]
5390alow...9/18/20209588System.AccessViolationException 보호된메모리 부분 예외처리 [1]
5389C# 8...9/18/20207870후위 증감 연산자 오버로딩 방법 좀 알려주세요 [4]
5388영귤9/17/20208868Nullable reference type 에 Non-nullable reference type 을 대입해도 경고가 발생하지 않습니다. [2]
5387하태9/17/20207302안녕하세요! 비동기 통신과 관련하여 질문하나만 드리겠습니다! [3]
5386박민웅9/16/20209071정성태 스승님 안녕하세요 !! [1]
5385영귤9/12/202065923항 연산자에 ref 지원? [1]
5384guest9/10/20206480시작하세요! C# 8.0 프로그래밍 책에 오타가 있는 것 같습니다. [3]
5383민성9/8/20207967안녕하세요 자주 도움을 주셔서 감사드립니다. WPF에서 크롬 브라우저 삽입에 대하여 [1]
5382정씨9/4/20207122[C#] 시리얼통신 수신된 데이터를 그리드뷰에 뿌르는데 일정 시간이 지나면 버벅 거리는 이유가 뭘까요?? [3]
5381질문 있...9/4/20206882웹으로 사용하는 c#과 응용프로그램으로 사용하는 c#이 많이 다른가요?? [2]
5380yeon9/3/20206951winform 의 datagridview는 바인딩이 안 되나요? [1]
5379guest9/2/20209632시작하세요! C# 8.0 프로그래밍 책에 오타가 있습니다. [3]
5378net9/2/20207108mes 응용프로그램을 .net 웹폼으로 만들기도 하나요? [2]
5377net9/2/20206511.net 사용한 웹폼으로 응용프로그램을 만들경우 [1]
5376영귤9/1/20206904nullable 타입간의 비교연산은 그냥 가능한 건가요? [1]
5375영귤8/30/20208389이벤트와 델리게이트의 차이가 궁금합니다. [2]
5374guest8/27/20209495시작하세요! C# 8.0 프로그래밍 책에 오타가 있습니다. [1]
5373agj8/26/20207661System.Single::ToString()함수의 IL코드를 보았는데 ldnull, throw가 전부입니다. 왜 이렇게 짧죠? [2]
5372민성8/24/20207632안녕하세요 WPF 웹브라우저 컨트롤에서 웹브라우저 자체를 엣지로 할 수가 있나요? [2]
... 16  17  18  19  20  [21]  22  23  24  25  26  27  28  29  30  ...