2012-05-21 72 views
0

enter image description here我想從WCF服務返回的數據綁定到使用MVVM的WPF中的網格。當我在視圖模型中使用WCF服務的邏輯時也是如此。使用MVVM模式綁定WPF網格到WCF服務

代碼背後:

this.DataContext = new SampleViewModel(); 

查看/ XAML:

<Window x:Class="Sample.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525"> 
<Grid> 
    <DataGrid ItemsSource="{Binding Students}" AutoGenerateColumns="False" > 
     <DataGrid.Columns> 
      <DataGridTextColumn Header="ID" Binding="{Binding ID}" /> 
      <DataGridTextColumn Header="Name" Binding="{Binding Name}" /> 
      <DataGridTextColumn Header="Address" Binding="{Binding Address}" /> 
     </DataGrid.Columns> 
    </DataGrid> 
</Grid> 
</Window> 

視圖模型:

public List<Student> Students { 
     get { 
      var service = new StudentServiceClient(); 
      var students = new List<Student>(service.GetStudents()); 
      return students; 
     } 
    } 

IStudentService:

[ServiceContract] 
public interface IStudentService { 
    [OperationContract] 
    IEnumerable<Student> GetStudents(); 
} 

[DataContract] 
public class Student { 
    public string Name { get; set; } 

    public int ID { get; set; } 

    public string Address { get; set; } 
} 

StudentService.svc:

public class StudentService : IStudentService { 
    public IEnumerable<Student> GetStudents() { 
     var students = new List<Student>(); 

     for (int i = 0; i < 3; i++) { 
      students.Add(new Student { 
       Name = "Name" + i, 
       ID = i, 
       Address = "Address" + 1 
      }); 
     } 

     return students; 
    } 
} 

當我運行該應用程序,我沒有看到在網格中的螞蟻記錄..

+0

修正了這個問題..缺少數據合同中的DataMember屬性 – Arihant

回答

0

是否有任何約束力的錯誤?或者可能存在serviceide問題,並且該服務不返回任何條目。你調試/斷點屬性的getter並檢查結果?

+0

當從服務中調試時,它顯示正確的結果。但是,在VM中,它顯示正確的計數,但集合顯示擴展數據的成員爲空。 – Arihant

+0

擴展數據是什麼意思?返回的集合是什麼類型?您可以通過右鍵單擊servicereference並選擇配置來更改數據類型。 – csteinmueller

+0

它沒有顯示正在從服務中正確返回的屬性..附加到問題 – Arihant

3
public List<Student> Students { 
    get { 
     var service = new StudentServiceClient(); 
     var students = new List<Student>(service.GetStudents()); 
     return students; 
    } 
} 

每次使用Students屬性/讀取此代碼將連接到服務器並檢索學生。這太慢了。

在ViewModel的構造函數中(或在一個單獨的方法/命令中)加載學生,並從getter返回這個集合。

爲什麼你的解決方案不起作用可能的原因:

  1. 列表不通知的集合變化的圖。改用ObservableCollection。

  2. 當學生資產發生變化(var students = new List<Student>(service.GetStudents());)時,沒有信號顯示該資產已更改;在ViewModel上實現INotifyPropertyChanged。

  3. 確保服務返回數據。

+0

+1的問題; @Arihant:我在想,WPF正在根據您的只讀不可觀察列表進行一些優化,而不是刷新空白視圖。如果將WCF調用移動到構造函數中並將'Students'暴露爲'ObservableCollection'並不能解決問題,那麼您也可以嘗試添加一個setter(我不知道這是必需的還是有幫助的)。 –