d:DataContext=“{d:DesignInstance Type=local:TextViewModel}” 이거하고
<UserControl.DataContext>
local:TextViewModel/
</UserControl.DataContext>
이것 뭔 차이인가요?
또 DesignInstance 이게 뭐 작동하는건지 쉽게 설명 부탁드립니다 ㅠ
검색해도 용어가 너무 어려워서 이해못했습니다
또
IsDesignTimeCreatable=False 여기서 False하고 True 이게 뭐 작동하는건지?
차이 볼려고 둘다 써봤는데 눈에 띄지 않아서요
Prefix ‘d’ 는 ‘expression/blend/2008’ 관련 네임스페이스로
디자인 타임에서만 유효한 기능으로
질문주신 코드에서 처럼 d:DataContext로 지정하면
디자인타임에서 뷰모델 인스턴스가 DataContext에 할당되어
명시적으로 VS 디자이너에서 뷰모델이 가지고 있는 속성 등 인텔리센스를 이용할 수 있는 편리성이 주어집니다.
IsDesignTimeCreatable 속성 또한 위 설명과 관련해서 디자이너 화면에서 해당 컨트롤 등이 인스턴스화 되도록 하는 속성 입니다.
기본값으로는 True이며 디자이너에 컨트롤이 올라가면 실제 인스턴스화 되면서 동작 됩니다.
다른 이야기지만 ViewModel을 View에서 직접
<DataContext>
<뷰모델 />
<DataContext/>
또는 (위와 동일한 방식)
this.DataContext = new 뷰모델();
와 같이 적용해서 사용하는것은 뷰와 뷰모델간 강력한 종속성이 만들어지고
뷰는 뷰모델과 1:1로 항상 붙어 다닐 수 밖에 없어 재사용이 불가능한 구조가 되어집니다.
(뷰 비즈니스 로직 기능은 다르지만 뷰는 동일한 상황에서 해당 뷰 재사용성 불가)
이는 좋은 MVVM 구조라고 볼 수는 없으니 참고 하시는것이 좋습니다.
친절한 답변 감사드려요~
추가로 IsDesignTimeCreatable false 로 사용하는 경우가 어떤 환경일때일까 여쭙니다.
또 하나의 XAML에서
d:DataContext=“{d:DesignInstance Type=local:TextViewModel IsDesignTimeCreatable=False}”
<UserControl.DataContext>
local:TextViewModel/
</UserControl.DataContext>
둘다 쓰는것은 좋지않은 예시일까요?
디자인 타임에서 해당 컨트롤이 인스턴스화 되면서 런타임 환경에 동적으로 할당 되는 무언가 때문에 디자인 타임에서 오류등으로 인해 정상적으로 표시 되지 않은 경우 false로 설정해서 사용할 수 도 있습니다.
네 단순히 보았을때는 d:DataContext나 <뷰.DataContext/> 나 VS 디자이저상에서는 동일하게 적용 되므로 불필요해 보입니다.
d 접두사는 빼고 <뷰.DataContext/> 만 적용하셔도 인텔리센스는 사용할 수 있을거에요.
덕분에 단번 이해 됐습니다!! 감사합니다!