2012-12-20 38 views
1

該程序工作正常,不會崩潰或什麼。但數據沒有顯示在表(數據網格)無法使用MVVM模式從數據庫中顯示WPF表格

更新版本:

查看: Userperspective.xaml

我得到的,因爲綁定路徑「產品」的XAML文件中的錯誤是未知DataContext的

<Grid Margin="0,0,0,-20"> 
     <DataGrid Name="Producttable" ItemsSource="{Binding Path=Products}"     
        HorizontalAlignment="Left" Height="200" Margin="10,44,0,0" 
        VerticalAlignment="Top" Width="972" /> 

查看: Userperspective.xaml.cs

public partial class Userperspective : Window 
{ 
    public Userperspective() 
    { 
     InitializeComponent(); 
     DataContext = new ProductViewModel(); 
    } 
} 

ProductviewModel

 private readonly Product _product; 
    private IBackend _backend; 
    public ICommand ProductCommand { get; set; } 
    public IList<Product> Products { get; set; } 

    public ProductViewModel() 
    { 
     _backend = new BackendService(); 
     _product = new Product(); 
     ProductCommand = new ProductCommand(this); 
    } 

    public Product Product() 
    { 
     return _product; 
    } 

    public void LoadProducts() 
    { 
     Products = _backend.GetProducts(); 
     RaisePropertyChanged("Products"); 
    } 

Productcommand

private readonly ProductViewModel _vm; 

    public ProductCommand(ProductViewModel vm) 
    { 
     this._vm = vm; 
    }  

    public void Execute(object parameter) 
    { 
     _vm.LoadProducts(); 
    } 

BackendService

namespace _blabla 
{ 
    class BackendService : IBackend 
    { 
     public IList<Product> GetProducts() 
     { 
      using (var db = new NORTHWNDEntities()) 
      { 
       var query = from p in db.Products 
          select new Product 
          { 
           Name = p.ProductName, 
          }; 

       return query.ToList(); 
      } 
     } 
    } 
} 

Ibackend

namespace _blabla.Commands 
{ 
    public interface IBackend 
    { 
     IList<Product> GetProducts();  
    } 
} 
+0

[您最後一個問題的答案](http://stackoverflow.com/a/13971624/620360)是正確的。對於綁定,您需要[屬性](http://msdn.microsoft.com/zh-cn/library/w86s7x04.aspx)。 – LPL

+0

我已經做到了。我不需要看到更改,我只需要查看錶格顯示數據庫中的數據。但它仍然劑量工作:( – Zaz

+0

如果您將產品列表加載到您的viewModel構造函數中而不是getter中,會發生什麼情況?還可以詳細說明什麼是不工作的?您是否收到任何錯誤?程序崩潰了嗎?「不起作用「不給我們提供足夠的信息來幫助 –

回答

1

看到,因爲你是對於WPF和MVVM來說,你應該把問題分解成更易於管理的東西。你的代碼有很多, MVVM,命令,數據庫訪問和一些抽象。你的意圖是合理的,但並不能解決這個問題。

由於您提供的信息我甚至不能100%確定問題是什麼,但我懷疑它是綁定還是數據庫訪問。我將專注於展示對你的約束性方面。

看到我無法訪問您的數據庫代碼我嘲笑了一些類來幫助我解決這個問題。

注:命令代碼是噪音,所以我會從我的回答中取出,並專注於結合的產品列表(你可以用你的指揮解決方案一旦這樣的工作整合)。

產品

public class Product 
{ 
    public string Name { get; set; } 
    public string Description { get; set; } 

    public override string ToString() 
    { 
     return string.Format("Product: ({0}), {1}", Name, Description); 
    } 
} 

BackendService:這基本上返回琳琅滿目的產品,以代替能夠訪問數據庫。

class BackendService : IBackend 
{ 
    public IList<Product> GetProducts() 
    { 
     return new Product[] 
     { 
      new Product{ Name = "Laptop", Description = "Dell 17inch laptop" }, 
      new Product{ Name = "Mobile Phone", Description = "iPhone" }, 
      new Product{ Name = "Television", Description = "Samsung 32 inch plasma" }, 
      new Product{ Name = "Car", Description = "Gran Torino" }, 
      new Product{ Name = "Book", Description = "Effective C#" }, 
     }; 
    } 
} 

我已綁定的產品列表視圖模型爲Listbox,因爲我沒有訪問DataGrid但除此之外我沒有修改主窗口中的代碼。

Mainwindow.xaml

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="*" /> 
     <RowDefinition Height="Auto" /> 
    </Grid.RowDefinitions> 
    <ListBox Margin="5" 
      ItemsSource="{Binding Path=GetProducts}"/> 
</Grid> 

Mainwindow.cs

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     DataContext = new ProductViewModel(); 
    } 
} 

現在如果我使用您的視圖模型,我得到一個NullReferenceException從您的通話發起對_backend.GetProducts()因爲你沒有實例化您的BackendService的實例。如果我更新構造函數,如下所示:

public ProductViewModel() 
{ 
    _backend = new BackendService(); 
    _product = new Product(); 
    ProductCommand = new ProductCommand(this); 
} 

並運行該應用程序,產品列表顯示正確。

enter image description here

你應該能夠整合我提供了到項目的代碼,並證明它是工作。當您對此感到滿意時,您應該更新BackendService類,以調用數據庫中產品的列表。我會建議這樣做,因爲所有的綁定都是這樣,你知道它是不是工作的綁定或數據庫調用。

+0

嘿本傑明。感謝您的時間和耐心。我試圖按照你的例子在一個新的項目中,它不適合我在那裏:/我剛剛更新了上述程序後,你和理查德的建議 – Zaz

+0

當某些東西不起作用請詳細解釋什麼是不工作。你應該可以在沒有任何問題的情況下使用我在新項目中提供的代碼(使用viewModel)。如果您只告訴我「它對我不起作用」,我將無法提供任何幫助。 –

+0

謝謝,它工作:) – Zaz

0

您嘗試執行GetProducts但是這是一個地產不是一個方法 - 創建一個單獨的方法來加載產品和 更改屬性名稱爲更有意義的

public IList<Product> Products {get;set;} 

然後創建一種方法來加載您的產品

public void LoadProducts() 
{ 
    Products = _backend.GetProducts(); 
    //You will need to notify of property change here 
    OnPropertyChanged("Products"); 
} 

然後bin d到Products在XAML

<Window x:Class="_blabla.View.Userperspective" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="UserPerspective" Height="500" Width="1000"> 

    <Grid Margin="0,0,0,-20"> 
     <DataGrid Name="Producttable" ItemsSource="{Binding Path=Products}"     
        HorizontalAlignment="Left" Height="200" Margin="10,44,0,0" 
        VerticalAlignment="Top" Width="972" /> 
    </Grid> 
</Window> 

然後在你的命令調用LoadProducts

public void Execute(object parameter) 
{ 
    _vm.LoadProducts(); 
} 

您將需要實現INotifyPropertyChanged所以UI知道你已經改變了Products物業

+0

感謝您回答Richard。現在,我只在xaml文件中收到同樣的錯誤 因爲未知的Datacontext,無法解析符號'Products' – Zaz

+0

程序工作正常,但datagrid中仍然沒有數據,並且在ItemsSource =「{綁定產品}它說:由於未知的Datacontext,無法解析符號'產品'。 – Zaz