Кнопки отправки и отмены формы данных
У меня проблемы с кнопками Подтвердить и Отменить в форме данных для 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);
}
}
VMAccount:
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
2 ответа
Получается, что я пытался отредактировать вложенный объект, чего нельзя сделать, пока не выпущен инструментарий RIA SP1. Благодарю.
Ваша проблема может быть похожа на вопрос Silverlight 3 Кнопка фиксации Dataform не активируется
Пожалуйста, пересмотрите этот ответ
У меня была такая же проблема с использованием Silverlight 4 и RIA Serivces.
Я решил установить WCF RIA Services с пакетом обновления 1 и переустановить WCF RIA Services Toolkit для WCF RIA Services SP1.
Эти два установщика можно найти по адресу: http://www.silverlight.net/getstarted/riaservices/
Прямая ссылка на WCF RIA Services SP 1: http://go.microsoft.com/fwlink/?LinkId=205085 Прямая ссылка на инструментарий WCF RIA Services для WCF RIA Services SP1: http://go.microsoft.com/fwlink/?LinkID=205088