Silverlight のデータフォームの [コミット] ボタンと [キャンセル] ボタンに問題があります。最初は、ユーザーが [編集] をクリックしたときに [キャンセル] ボタンが有効にならなかった理由がわかりませんでした。いくつかの調査の結果、これはオブジェクトが IEditableObject ではないことが原因であることがわかりました。これでキャンセル ボタンがソートされましたが、値が変更された後でも、以前はそうではなかった [コミット] ボタンが有効になることが決定されました。
私の質問は、それを有効にするにはどうすればよいですか?
XAML:
    <dataFormToolkit:DataForm CurrentItem="{Binding ViewModel, ElementName=AccountPage, Mode=TwoWay}" CommandButtonsVisibility="{Binding ViewModel.CommandButtonsVisibility, ElementName=AccountPage, Mode=TwoWay}" AutoEdit="False" AutoGenerateFields="False" AutoCommit="False">
        <dataFormToolkit:DataForm.EditTemplate>
            <DataTemplate>
                <StackPanel>
                    <dataFormToolkit:DataField Label="Organisation Name">
                        <TextBox Text="{Binding Customer.Name, Mode=TwoWay}"/>
                    </dataFormToolkit:DataField>
                </StackPanel>
            </DataTemplate>
        </dataFormToolkit:DataForm.EditTemplate>
    </dataFormToolkit:DataForm>
XAML.cs:
public partial class Account : Page
{
    public VMAccount ViewModel { get; set; }
    public Account()
    {
        InitializeComponent();
    }
    // Executes when the user navigates to this page.
    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        ViewModel = new VMAccount(Global.Client.CurrentPerson.Customer);
    }
}
VM アカウント:
public class VMAccount : VMBase, IEditableObject
{
    public VMAccount(Customer customer)
    {
        Customer = customer;
    }
    private Customer m_oCustomer;
    public Customer Customer
    {
        get { return m_oCustomer; }
        set
        {
            if (m_oCustomer != value)
            {
                m_oCustomer = value;
                OnPropertyChanged("Customer");
            }
        }
    }
    public event EventHandler<AsyncResultArgs> SaveCustomerSuccess;
    public event EventHandler<AsyncResultArgs> SaveCustomerFailure;
    #region IEditableObject Members
    public void BeginEdit()
    {
        Customer.PropertyChanged += new PropertyChangedEventHandler(OnCustomerPropertyChanged);
        Customer.ContactInfo.PropertyChanged += new PropertyChangedEventHandler(OnCustomerPropertyChanged);
    }
    public void CancelEdit()
    {
        (Customer as IRevertibleChangeTracking).RejectChanges();
        (Customer.ContactInfo as IRevertibleChangeTracking).RejectChanges();
    }
    public void EndEdit()
    {
        if (Customer.HasChanges)
        {
            Global.Client.MainContext.SubmitChanges((lo) =>
            {
                HandleResult("Save Customer", lo, true, SaveCustomerSuccess, SaveCustomerFailure);
            }, null);
        }
    }
    #endregion
    private void OnCustomerPropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        OnPropertyChanged("Customer");
    }
}
VMBase:
public class VMBase : INotifyPropertyChanged
{
    protected virtual void OnPropertyChanged(string property)
    {
        if (PropertyChanged != null) 
            PropertyChanged(this, new PropertyChangedEventArgs(property));
    }
    #region INotifyPropertyChanged Members
    public event PropertyChangedEventHandler PropertyChanged;
    #endregion
}
「OnCustomerPropertyChanged」イベント ハンドラを挿入して、Customer プロパティが変更されたことをデータフォームに強制的に通知できるかどうかを確認しましたが、イベントが発生しても違いはありません。これが問題であることを確認するために IEditableObject を削除しようとしました...
public class VMAccount : VMBase//, IEditableObject
...
助けてくれてありがとう。
編集: 顧客が RIA エンティティであることを追加する必要があります