2

アプリケーションでEntityFramework、WPF、およびMVVMを使用していますが、EntityObjects間の関係のデータバインディングの更新で問題が発生しました。問題を数行のXAMLに縮小することができました。まだ、EFとMVVMにあまり自信がないので、誰かが私を助けてくれることを願っています。

とにかく、ここでは単純化されたXAMLを使用します。

    <DatePicker Grid.Row="2" Grid.Column="1" 
                    SelectedDate="{Binding Path=File.SentDate, 
StringFormat={}{0:dd/MM/yyyy}, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
                    VerticalAlignment="Center" IsEnabled="{Binding Path=IsEnabled}"/>

        <ComboBox Grid.Row="3" Grid.Column="1" ItemsSource="{Binding Contacts}" DisplayMemberPath="Name" 
                  SelectedItem="{Binding Path=File.Sender, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" IsEditable="True"
                  VerticalAlignment="Center">
        </ComboBox>

        <Label Content="{Binding Path=File.SenderId}" Grid.Row="4"/>
        <Label Content="{Binding Path=File.Sender.Name}" Grid.Row="5"/>
        <Label Content="{Binding Path=File.SentDate}" Grid.Row="6"/>

最後の3つのラベルを使用してデータバインディングをテストしています。DatePickerを使用してFile.SentDateを変更すると、データバインディングが最後のラベルに問題なく更新されます。

これで、FileはタイプEntityObjectであり、タイプGUIDのSenderIdプロパティがあります。また、Senderプロパティを介して連絡先との関係もあります。明らかに、SenderIdは、Sender関係を介してFileに関連付けられている対応するContactEntityObjectのGUIDです。ファイルには、Contactタイプの単一の送信者のみを含めることができます。

とにかく、コンボボックスを使用して別の送信者を選択すると、File.SenderIdプロパティを表示するラベルが適切に更新されます。ただし、File.Sender.Nameプロパティを持つもの、つまり関係を使用するものは更新されません。

ですから、EFの関係のデータバインディングを更新することには何か特別なことがあると思います。

誰かがこれに対する解決策を提案できますか?

4

3 に答える 3

1

残念ながら、Entity Frameworkは、関連付けプロパティが変更されても通知しません。これが、バインディングが機能しなかった理由です。

この問題はMicrosoftに報告されています:http://connect.microsoft.com/VisualStudio/feedback/details/532257/entity-framework-navigation-properties-don-t-raise-the-propertychanged-event

別の回避策は、 WPFアプリケーションフレームワーク(WAF)のBookLibraryサンプルアプリケーションによって示されています。Bookクラスは、AssociationChangedイベントをリッスンし、適切なPropertyChangedイベントを発生させます。

public Book()
{
    …
    LendToReference.AssociationChanged += LendToReferenceAssociationChanged;
}

private void LendToReferenceAssociationChanged(object sender, 
        CollectionChangeEventArgs e)
{
    // The navigation property LendTo doesn't support the PropertyChanged event. 
    // We have to raise it ourselves.
    OnPropertyChanged("LendTo");
}
于 2011-07-16T19:51:33.227 に答える
0

解決策を見つけたように見えますが、私にとっては回避策のようです。それは私が期待した解決策ではありませんが、うまくいきます。

XAML は、1 つのことを除いて上記と同じです。File.Sender.Name にバインドする代わりに、次のように File.SenderName にバインドします。

<Label Content="{Binding Path=File.SenderName}" Grid.Row="4"/>

この場合の SenderName は、次のような部分クラスに追加したオブジェクト File のプロパティです。

public partial class File
{
        public string SenderName
        {
            get
            {
                if (this.Sender != null)
                {
                    return this.Sender.Name;
                }

                return string.Empty;
            }
        }
protected override void OnPropertyChanged(string property)
        {

            if (property == "SenderId")
            {
                OnPropertyChanged("SenderName");
            }
            base.OnPropertyChanged(property);
        }
}

ここで何が起こるかというと、SenderId プロパティが変更された場合、フレームワークに SenderName プロパティも更新するように指示します。それでおしまい。魅力のように機能します。これが機能するはずの方法であるとはまだ確信していませんが。

于 2011-07-15T13:32:15.340 に答える