2011-11-11 1 views
3

私は記事WPF/Silverlight: Step By Step Guide to MVVMを読もうとしましたが、完全に理解できません。Viewコードのコードを残しておくのは悪いですか?

しかし、私は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にViewModelにのインスタンスを設定します。

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

あなたは内のViewModelを設定する必要があり、このWindowをインスタンス化している他のクラス/ウィンドウを使用している場合それ。例えば:このように

<!-- 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}" /> 

のViewModelでのごロジック滞在をし、ビューから切り離さ:あなたがアクションでMVVMを見ることができます

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

はだから今、メインウィンドウXAMLであなたは以下のようなバインディングを使用することができますファイル。

PS:私はConsoleDataリストのObservableCollection<ConsoleData>を使用することをお勧めし

、メリットは以下のとおりです(MSDN

のObservableCollectionクラス

アイテムの通知を提供して動的なデータコレクションを表し追加、削除、またはリスト全体がリフレッシュされるときに発生します。

+0

ありがとう、できますxamlでDataContextを設定して、この最後のコード行を削除しますか? ServiceViewModelの実装方法対応するドキュメントへのリンクは大歓迎です。 – javapowered

+0

@javapowered:更新されたばかりの回答を参照してください。基本的に、ViewModelはObservableCollection DataItemsを公開し、XAMLでバインドします。答えは – sll

+0

です。はい、XAMLでDataContextを設定できます。名前空間の参照を追加し、「リソース」セクションにViewModelクラスのインスタンスを作成する必要があります。次に、DataContextをそのリソースにバインドします。 –

関連する問題