0

ここに画像の説明を入力してください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;
    }
}

アプリを実行すると、グリッドにアリのレコードが表示されません。

4

2 に答える 2

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

Students プロパティが使用または読み取られるたびに、このコードはサーバーに接続し、学生を取得します。それは遅すぎるでしょう。

ViewModel のコンストラクター (または別のメソッド/コマンド) で Student を読み込み、getter からこのコレクションを返します。

ソリューションが機能しない理由として、次のことが考えられます。

  1. List はコレクションの変更を View に通知しません。代わりに ObservableCollection を使用してください。

  2. Students プロパティが変更された場合 ( var students = new List<Student>(service.GetStudents());)、プロパティが変更されたというビューへの信号はありません。ViewModel に INotifyPropertyChanged を実装します。

  3. サービスがデータを返すことを確認してください。

于 2012-05-21T09:26:34.647 に答える
0

バインディングエラーはありますか?または、サービス側に問題があり、サービスがエントリを返さない可能性があります。プロパティのゲッターをデバッグ/ブレークポイントして結果を確認しましたか?

于 2012-05-21T09:16:52.770 に答える