这是一个奇怪的问题。我正在使用数据表单,当我编辑数据时,启用了保存按钮,但取消按钮不是。
环顾四周之后,我发现我必须实现IEditableObject才能取消编辑。伟大的我做到了(这一切都有效),但现在提交按钮(保存)显示为灰色,大声笑。任何人都知道为什么提交按钮不会再激活?
的Xaml
<df:DataForm x:Name="_dataForm"
AutoEdit="False"
AutoCommit="False"
CommandButtonsVisibility="All">
<df:DataForm.EditTemplate >
<DataTemplate>
<StackPanel Name="rootPanel"
Orientation="Vertical"
df:DataField.IsFieldGroup="True">
<!-- No fields here. They will be added at run-time. -->
</StackPanel>
</DataTemplate>
</df:DataForm.EditTemplate>
</df:DataForm>
结合
DataContext = this;
_dataForm.ItemsSource = _rows;
...
TextBox textBox = new TextBox();
Binding binding = new Binding();
binding.Path = new PropertyPath("Data");
binding.Mode = BindingMode.TwoWay;
binding.Converter = new RowIndexConverter();
binding.ConverterParameter = col.Value.Label;
textBox.SetBinding(TextBox.TextProperty, binding);
dataField.Content = textBox;
// add DataField to layout container
rootPanel.Children.Add(dataField);
数据类定义
public class Row : INotifyPropertyChanged , IEditableObject
{
public void BeginEdit()
{
foreach (var item in _data)
{
_cache.Add(item.Key, item.Value);
}
}
public void CancelEdit()
{
_data.Clear();
foreach (var item in _cache)
{
_data.Add(item.Key, item.Value);
}
_cache.Clear();
}
public void EndEdit()
{
_cache.Clear();
}
private Dictionary<string, object> _cache = new Dictionary<string, object>();
private Dictionary<string, object> _data = new Dictionary<string, object>();
public object this[string index]
{
get
{
return _data[index];
}
set
{
_data[index] = value;
OnPropertyChanged("Data");
}
}
public object Data
{
get { return this; }
set
{
PropertyValueChange setter = value as PropertyValueChange;
_data[setter.PropertyName] = setter.Value;
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string property)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(property));
}
}
}
答案 0 :(得分:0)
当你在代码隐藏中创建字段时,它们实际上只在表单上创建而不是“在内存中”。您可以通过单击取消按钮自行尝试,再次编辑时,表单将为空白,并且需要重新创建字段。
因此,当您创建字段时,需要输入以下代码才能实际创建字段。
if (_dataForm.Mode == DataFormMode.Edit)
{
_dataForm.CommitEdit();
_dataForm.BeginEdit();
}
执行此操作时,按钮将按预期运行。