【问题标题】:Using MVVM Pattern Binding WPF Grid to a WCF Service使用 MVVM 模式将 WPF 网格绑定到 WCF 服务
【发布时间】:2012-05-21 18:05:03
【问题描述】:

我正在尝试使用 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;
        }
    }

学生服务:

[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;
    }
}

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

【问题讨论】:

  • 修复了问题.. 缺少数据合同中的 DataMember 属性

标签: wcf mvvm wpfdatagrid


【解决方案1】:
public List<Student> Students {
    get {
        var service = new StudentServiceClient();
        var students = new List<Student>(service.GetStudents());
        return students;
    }
}

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

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

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

  1. List 不会通知 View 集合的变化;请改用 ObservableCollection。

  2. 当 Students 属性更改 (var students = new List&lt;Student&gt;(service.GetStudents());) 时,不会向 View 发出该属性已更改的信号;在 ViewModel 上实现 INotifyPropertyChanged。

  3. 确保服务返回数据。

【讨论】:

  • +1; @Arihant:我认为 WPF 正在根据您的只读不可观察列表进行一些优化,而不是刷新空视图。如果将 WCF 调用移动到构造函数并将 Students 公开为 ObservableCollection 不能解决问题,您也可以尝试添加一个 setter(虽然我不知道这是必需的还是会有所帮助)。跨度>
【解决方案2】:

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

【讨论】:

  • 从服务调试时,它会显示正确的结果。但是在 VM 中,它显示了正确的计数,但集合显示扩展数据的成员为空。
  • 扩展数据是什么意思?返回的集合是什么类型的?您可以通过右键单击服务引用并选择配置来更改数据类型。
  • 它没有显示从服务中正确返回的属性..问题附加的截图
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多