2017-06-13 65 views
0

我正在實施mvvm模型。我有類調用Dep_Class在我的模型WPF MVVM綁定實體框架對Combobox的工作結果

using System.ComponentModel; 

namespace mency.Models 
{ 
    class Dep_class : INotifyPropertyChanged 
    { 
     private string dep_name; 

     public string Dep_Name 
     { 
      get { return dep_name; } 
      set 
      { 
       dep_name = value; 
       OnPropertyChanged("Dep_Name"); 
      } 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 
     public Dep_class() 
     { 

     } 
     private void OnPropertyChanged(string propertyName) 
     { 
      if(PropertyChanged != null) 
      { 
       PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
      } 

     } 

    } 
} 

和我已經通過的EntityFramework連接數據庫,這是EF

namespace mency 
{ 
    using System; 
    using System.Collections.Generic; 

    public partial class branch 
    { 
     public int Branch_ID { get; set; } 
     public string Branch_Name { get; set; } 
    } 
} 

生成的類在我的頁面代碼,我XAML

<Page x:Name="Departments_page" x:Class="mency.Department" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:local="clr-namespace:mency" 
     xmlns:m="clr-namespace:mency.Models" 
     mc:Ignorable="d" 
     d:DesignHeight="502" d:DesignWidth="722" 
     Title="Department" Initialized="Departments_page_Initialized" Loaded="Departments_page_Loaded"> 
    <Page.Resources> 
     <m:Dep_class x:Key="dep_class" /> 

    </Page.Resources> 

    <Grid Background="MediumAquamarine"> 

      <ComboBox x:Name="Branch_cbox" ItemsSource="{StaticResource dep_class}" /> 



    </Grid> 

如何將組合框綁定到我的數據庫的加載結果。 這是我後面的頁面代碼:

using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Navigation; 
using System.Windows.Shapes; 

namespace mency 
{ 
    /// <summary> 
    /// Interaction logic for Department.xaml 
    /// </summary> 
    public partial class Department : Page 
    { 
     medical_databaseEntitiescon _dbObj; 


     public Department() 
     { 


      InitializeComponent(); 


     } 

     private void Departments_page_Initialized(object sender, EventArgs e) 
     { 

     } 

     private void Departments_page_Loaded(object sender, RoutedEventArgs e) 
     { 
      _dbObj = new medical_databaseEntitiescon(); 
      //ComboBox = _dbObj.branches.ToList(); // I want combobox loaded with the results of this List 
     } 
    } 
} 

我很長的問題抱歉,但我希望有人能幫助我

+1

如果你想實現MVVM,我會建議不要使用代碼隱藏。 MVVM字面意思是Model-View-ViewModel,使用背後的代碼是違背該框架的。至於鏈接,如果你真的想使用代碼隱藏,不要在你的xaml中設置ItemSource = {Binding ...],而是在'Department()中使用'Branch_cbox.ItemsSource = * database * '構造函數,並設置'DataContext = this;'。 –

+0

好的,但你能解釋如何使用它沒有代碼隱藏plz? –

+1

您應該在模型中創建medical_databaseEntitiescon對象。在模型中編寫一個方法返回_dbObj.branches。在viewModel中創建你的模型的一個實例。還要在視圖模型中創建一個List 屬性,在getter中調用模型的_dbObj.branches方法。將此列表綁定到UI中的組合框。 –

回答

1

在我的意見,我建議不要使用代碼隱藏與MVVM結構。

我相信你會在網上找到大量的MVVM教程,但我會在這裏簡單回答一下。

首先,你需要創建一個類(視圖模型),將其命名爲任何東西,並設置爲你的DataContext所以你的視圖(XAML)知道到哪裏找綁定,也改變ItemsSource="{StaticResource dep_class}"ItemsSource="{Binding dep_class}"

<Page x:Name="Departments_page" x:Class="mency.Department" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:local="clr-namespace:mency" 
    xmlns:m="clr-namespace:mency.Models" 
    mc:Ignorable="d" 
    d:DesignHeight="502" d:DesignWidth="722" 
    Title="Department" Initialized="Departments_page_Initialized" Loaded="Departments_page_Loaded"> 
<Page.DataContext> 
    <m:Dep_class *name of viewmodel class* /> 
</Page.DataContext> 
<Grid Background="MediumAquamarine"> 
     <ComboBox ItemsSource="{Binding dep_List}" SelectedItem="{Binding SelectedDept, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> 
</Grid> 

然後,在你的類,你可以創建一個列表/集合稱爲dep_List,並呼籲SelectedDept一個Dep_class變量。記得在你的viewmodel中實現INotifyPropertyChanged,這樣它就可以'聽'和'更新'視圖的變化。最後,在您的視圖模型中,您可以使用數據庫中的值填充dep_List(如果需要,使用DisplayMemberPath)。我知道它需要付出很多,但是一旦你學會了,它非常有趣的使用。我不會爲你寫你的視圖模型的代碼,因爲這將是spoonfeeding,而是這裏有一些有用的鏈接:

MVVM Creating the ViewModel

Implementing the Model-View-ViewModel Pattern(有點難以理解)

The World's Simplest C# WPF MVVM Example

1

我目前正在研究一個大量涉及WPF與實體框架數據綁定的項目。充分利用電源數據綁定的唯一方法是創建包裝數據庫對象的包裝類。這很煩人,但它是唯一的方法。

我有一個基類,名爲ObservableObjectBase我所有的模型(包裝器)實現了所有Notify Property Change爲我工作,然後確保我的MVVM框架適當地使用它。

沒有一套辦法做到這一點,但我會簡單介紹一下我的解決方案:

主持人(DAL) - 我的演示類通過處理所有的讀取和寫入數據,以及轉化的數據庫對象包裹它們。當數據寫入數據庫時​​,該類還負責將包裝轉換回適用於Entity Framework的數據。

演示模型(ViewModel) - 它存儲所有包裝器對象,並充當UI的DataContext - 它不保留對任何實體框架對象的引用。

這對於某些人來說有點麻煩,而且直接綁定到數據庫對象本來就不錯,但不幸的是這並不是一種奢侈品。