2011-11-11 16 views
3

WPF/Silverlight: Step By Step Guide to MVVM 문서를 읽으려고했지만 완전히 이해할 수 없습니다.코드를보기 코드에 보관하는 것이 좋지 않습니까?

그러나 나는 noticied 것 같은 지침 : 거의 코드를하도록되어 당신의 View.xaml.cs입니다

.

아래 코드를 어떻게 수정해야합니까? WCF 코드를 다른 곳으로 추출해야합니까? 감사.

/// <summary> 
/// Interaction logic for MainWindow.xaml 
/// </summary> 
public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
     ChannelFactory<IManagementConsole> pipeFactory = 
       new ChannelFactory<IManagementConsole>(
        new NetNamedPipeBinding(), 
        new EndpointAddress(
         "net.pipe://localhost/PipeManagementConsole")); 

     IManagementConsole pipeProxy = 
      pipeFactory.CreateChannel(); 

     List<ConsoleData> datas = new List<ConsoleData>(); 
     foreach (StrategyDescriptor sd in pipeProxy.GetStrategies()) 
     { 
      datas.Add(pipeProxy.GetData(sd.Id)); 
     } 
     dataGrid1.ItemsSource = datas; 
    } 
} 
+0

정확히 왜보기에 WCF 코드가 있습니까? 이것은 매우 나쁜 디자인처럼 보입니다 ... –

+0

http://stackoverflow.com/questions/3878610/why-keep-code-behind-clean-and-do-everything-in-xaml 중복 될 것 같습니다 –

답변

1

예, 이것은 특히 MVVM 관점에서 나쁜 관행이다.

추출은 ServiceViewModel 클래스로 모든 비즈니스 로직은보기 단지의 DataContext에 뷰 모델의 인스턴스를 설정합니다

public MainWindow() 
{ 
     InitializeComponent(); 
     this.DataContext = new ServiceViewModel(); 
} 

당신은 당신이 내 뷰 모델을 설정해야이 윈도우의 인스턴스 인 다른 클래스/윈도우가있는 경우 그것. 예를 들어이 방법으로 뷰 모델에 논리 숙박

<!-- Considering that ServiceViewModel has 
    public string ServiceName property 
--> 
<TextBlock Text="{Binding ServiceName}" /> 

<!-- Considering that ServiceViewModel has 
    public List<ConsoleData> DataItems property 
--> 
<DataGrid ItemsSource="{Binding DataItems}" /> 

및보기에서 분리 :

MyWindow childWindow = new MyWindow(); 
childWindow.DataContext = new ServiceViewModel(); 

그래서 지금 당신은 MainWindow를 XAML에서 아래처럼 바인딩을 사용하여 파일을, 행동에 MVVM을 볼 수 있습니다.

PS :

내가 ConsoleData 목록에 대한 ObservableCollection<ConsoleData>을 사용하는 것이 좋습니다 것

, 이점은 다음과 같습니다 (MSDN)

ObservableCollection에 클래스

알림을 항목을 제공하는 동적 데이터 컬렉션을 나타냅니다 추가, 제거 또는 전체 목록이 새로 고쳐질 때

+0

감사합니다, 수 있습니다. xaml에서 DataContext를 설정하고이 마지막 코드 줄을 제거합니까? ServiceViewModel을 구현하는 방법은 무엇입니까? 해당 문서에 대한 링크를 환영합니다. – javapowered

+0

@javapowered : 방금 업데이트 된 답변을 참조하십시오. 기본적으로 ViewModel은 ObservableCollection DataItems를 노출하고 응답 – sll

+0

에 표시된 것처럼 XAML에 바인딩합니다. 예, XAML에서 DataContext를 설정할 수 있습니다. 네임 스페이스 참조를 추가하고 Resources 섹션에서 ViewModel 클래스의 인스턴스를 만들어야합니다. 그런 다음 DataContext를 해당 리소스에 바인딩합니다. –

관련 문제