使用MVVM模式将WPF网格绑定到WCF服务

时间:2012-05-21 09:01:52

标签: wcf mvvm wpfdatagrid

enter image description here我正在尝试使用MVVM将从WCF服务返回的数据绑定到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;
    }
}

当我运行应用程序时,我没有在网格中看到蚂蚁记录..

2 个答案:

答案 0 :(得分:3)

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

每次使用/读取学生属性时,此代码将连接到服务器并检索学生。那太慢了。

将Student加载到ViewModel的构造函数中(或在单独的方法/命令中),并从getter返回此集合。

您的解决方案不起作用的原因可能是:

  1. 列表不会通知视图集合的更改;改为使用ObservableCollection。

  2. 当学生属性发生变化(var students = new List<Student>(service.GetStudents());)时,视图中没有信息表明该属性已更改;在ViewModel上实现INotifyPropertyChanged。

  3. 确保服务返回数据。

答案 1 :(得分:0)

是否有任何绑定错误?或者可能存在服务器问题,并且服务不返回任何条目。您是否调试/断开了属性的getter并检查结果?