2012-12-11 5 views
0

를 사용하여 WPF에서 모델 속성을 액세서 방법 :내가 지금이 넓은 또는 바보 같은 질문,하지만 수 있습니다 MVVM 및 WPF 새로운 오전 MVVM 빛

내가 MVVM 패턴을 사용하고 1 뷰 모델, 여러 가지 전망을 및 몇 가지 모델. 모든보기는 내 mainwindow.xaml에있는 Usercontrols입니다.

해당 뷰는 몇 가지 속성이있는 모델에 바인딩되며 그 중 하나는 사용자 정의 컨트롤에서 그림을 동적으로 변경하는 데 사용하려고합니다.

나는이 속성에 액세스하려고 애쓰는 데 매우 어려움을 겪고 있으며이 질문에 "올바른"MVVM 방식을 사용하고 있습니다.

내 mainwindow.xaml :

<Window.Resources> 
    <DataTemplate DataType="{x:Type Model:Device}"> 
     <Canvas> 
      <View:DeviceUserControl/> 
     </Canvas> 
    </DataTemplate> 
</Window.Resources> 

//---- SNIP---- 

<Grid Name="grid1"> 
    <ItemsControl ItemsSource="{Binding Devices}" /> 
</Grid> 

DeviceUserControl.xaml

//--- SNIP --- 
Image Name="DeviceImage" Source="{StaticResource IconAdd}"/> 

DeviceModel

//--- SNIP --- 
public enum Typeenum 
{ 
FrequenceGenerator, 
Oscilloscope, 
Test1, 
Test2 
}; 
public Typeenum Type { get { return type; } set { type = value; NotifyPropertyChanged("Type"); } } 

내가 원하는 개체 유형에 따라 DeviceImage을 변경하십시오. dependencyproperties 시도했지만 예상대로 작동하지 않았다 (매번 같은 형식을 반환). UserControl이 인스턴스화 될 때 이미지 소스를 변경하는 데에만 관심이 있으므로 notifyPropertyChanged가 실제로 필요하지 않습니다.

+0

먼저이 게시물에는 질문이 없습니다. 요약하자면, MVVM에서 뷰는 모델이 아닌 뷰 모델에 바인딩되어 있습니다. 좋은 접근법은 뷰 당 하나의 뷰 모델을 보유하는 것이므로 MainViewModel이있는 MainView (메인 윈도우 일 수도 있음)가 있어야합니다. 각 UserControl-View에는 UserControl-ViewModel이 있어야합니다. 이런 종류의 구조는 당신의 솔루션을 가리킨다 ... – Batuu

+0

내 viewmodel을 뷰 당 하나의 VM으로 나누는 것이 맞다고 생각한다. 그러나 나는 아직 Mainview가 각각 자신의 viewmodel을 가진 여러개의 뷰로 구성되어있는 예제를 보지 못했습니다. –

답변

0

먼저 뷰를 모델이 아닌 ViewModel에 바인딩해야합니다. 적어도 그것이 MVVM의 전부입니다. 또한 속성이 변경 될 때 어떤 일이 발생하려면 ViewModel (INotifyPropertyChanged 인터페이스를 구현해야한다는 것을 알고 있다고 가정)에서 PropertyChanged 이벤트를 구독하고 속성 변경시 발생해야하는 작업에 대한 논리를 지정해야합니다 그곳에.

코드 샘플

this.PropertyChanged += (s,e)=>{ 
    // Your code here. 
    // e.g. this.MyImageSource = "http://img.com/image.jpg" 
} 

코드 샘플은 속성 변경에 대한 이벤트가 PropertyChanged라는 이미지 컨트롤의 소스가 뷰 모델의 MyImageSource 속성에 바인딩 데이터 있다는 것을 가정한다. 희망이 도움이됩니다.