2011-11-11 87 views
3

我试过阅读文章WPF/Silverlight: Step By Step Guide to MVVM,但我完全无法理解它。将View代码保留在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:

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

如果您有其他类/窗口,它是实例化这个窗口中,您应该在设置视图模型它。例如:

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

所以,现在你可以看到MVVM在行动上,在主窗口XAML文件,你可以使用绑定象下面这样:

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

这样你的逻辑留在视图模型和视图分离。

PS:

我会建议使用ObservableCollection<ConsoleData>为ConsoleData名单,好处是:(MSDN

的ObservableCollection类

表示一个动态数据采集,提供通知时 项目添加,删除或整个列表刷新时。

+0

谢谢,可以我在xaml中设置了DataContext并消除了最后一行代码?如何实现ServiceViewModel?欢迎链接到相应的文档。 – javapowered

+0

@javapowered:看到刚刚更新的答案,基本上你的ViewModel应该公开'ObservableCollection DataItems'然后只是绑定它在XAML中,如答案 – sll

+0

所示是的,你可以在XAML中设置DataContext。您需要添加一个名称空间参考,并在参考资料部分创建一个ViewModel类的实例。然后你将DataContext绑定到该资源。 –

相关问题