2016-10-03 47 views
0

我最近從WinForms轉移到WPF,我很難分開ViewModel和View。我正在設計ViewModel中的整個視圖。儘管它行得通,但我確信它不是正確的方法。使用WPF和C的MVVM#

是否有無論如何我可以單獨View和ViewModel而不修改太多?我已經做了一些研究,但沒有那麼有用。

編輯

XAML

<Window x:Class="PackageDeliveryTool.FolderCheck" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Main Window" Height="350" Width="640" ResizeMode="NoResize" ShowInTaskbar="False" Topmost="True" Cursor="Arrow" Closing="Window_Closing"> 
<!-- From here is the XAML view code which includes button/Grid/StackPanel etc --> 
    </Window> 

而且我對模型的單獨CS文件。其中有屬性和propertyChanged事件。

這是特定Window的XAML.Cs文件。有行動,和模型對象(S),

public partial class CopyMessageWindow : Window 
{ 
    Model m = new Model("someValue"); 
    public CopyMessageWindow() 
    { 
     InitializeComponent(); 
    } 


    public void StartButton_Click(object sender, RoutedEventArgs e){ 
     //Some code goes here uses Model instance 
    } 

public void OtherLogicMethod(int val){ 
    //Some other logic not related to UI, but to Background program. Also uses Model Instance 
    } 

    private void CancelButton_Click(object sender, RoutedEventArgs e) 
    { 
     //When cancel button is clicked, uses Model instance 
    } 
} 

EDITx2

我已經寫很多代碼。我需要更簡單的分離視圖和ViewModel的方法。

+0

硬不知道到目前爲止你做過什麼可說的。 – Abion47

+0

查看它的一個非常基本的方法是,「設計」部分位於視圖中,而「加載」數據或此類編碼在ViewModel中完成。對於一個好的初學者友好的教程,請嘗試[MVVM教程](https://www.tutorialspoint.com/mvvm/index.htm) –

+0

ViewModel將您的模型和視圖粘合在一起。它可以包含更新視圖的邏輯(即背景顏色)。如果視圖更新可以通過XAML完成,那麼不要將它放在ViewModel上。 –

回答

2

遵循以下步驟:

1,創建你的模型:

public class Model 
{ 
    public string Name { get; set; } 
} 

2.創建視圖模型,這將是你的觀點的DataContext:

public class MainViewModel : BindableBase 
    {  
    public MainViewModel() 
    { 
     _model = new Model {Name = "Test"}; 
    } 
    private Model _model; 
    public Model Model 
    { 
     get 
     { 
      return _model; 
     } 
     set 
     { 
      _model = value; 
      OnPropertyChanged("Model");  
     } 
    } 
} 

3.In爲了實現MVVM模式進行完全分離,讓view.cs爲空:

public partial class MainWindow : Window 
    { 
    public MainWindow() 
    { 
     InitializeComponent(); 
    } 
    } 

4.創建YOUT視圖和DataContext的設置爲您的視圖模型:

<Window x:Class="WpfApplication1.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    mc:Ignorable="d" 
    DataContext="{StaticResource MainViewModel}"><Grid><TextBlock Text="{Binding Model.Name, Mode=TwoWay}"/></Grid></Window> 

5.實現您的BindableBase:

public class BindableBase : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged = delegate { }; 

    protected virtual void OnPropertyChanged(string propertyName) 
    { 
     PropertyChangedEventHandler handler = this.PropertyChanged; 
     if (handler != null) 
     { 
      var e = new PropertyChangedEventArgs(propertyName); 
      handler(this, e); 
     } 
    } 
} 
+0

調用方法呢?我應該在哪裏保持程序邏輯? – Prajwal

+0

您需要在您的視圖模型中使用命令:http://stackoverflow.com/a/1468830/3955716 – Rom

+0

一個合理的教程,但請注意Model.Name不實現INotifyPropertyChanged。可能是重複該屬性的原因。 –