我的 WPF 窗口直接绑定到实体框架数据上下文 (CollectionViewSource)。一旦找到记录,用户就会立即开始编辑。当表单变脏时,我想禁用“添加”按钮并启用“保存”和“撤消”按钮。有没有一种简单的方法可以使用绑定或事件来做到这一点?
我没有使用 MVVM。我首先使用实体框架数据库和 EF 设计器。我希望避免为每个字段添加代码。数据库相当大。
我的 WPF 窗口直接绑定到实体框架数据上下文 (CollectionViewSource)。一旦找到记录,用户就会立即开始编辑。当表单变脏时,我想禁用“添加”按钮并启用“保存”和“撤消”按钮。有没有一种简单的方法可以使用绑定或事件来做到这一点?
我没有使用 MVVM。我首先使用实体框架数据库和 EF 设计器。我希望避免为每个字段添加代码。数据库相当大。
如果您愿意,您可以在没有事件的情况下执行此操作。而且您可以利用DataBinding
MVVM 的强大功能。下面的示例以非常简单的方式演示了如何完成此操作。如果您的实体类还没有 IsDirty 属性(自从我使用数据库优先 EF 以来已经有一段时间了),您可以使用部分类添加该属性。
XAML:
<TextBlock HorizontalAlignment="Right" VerticalAlignment="Center" Text="Name:" Margin="10"/>
<TextBox x:Name="NameTextBox" Grid.Column="1" HorizontalAlignment="Stretch" VerticalAlignment="Center" Margin="10" Text="{Binding Name, UpdateSourceTrigger=PropertyChanged}"/>
<StackPanel Grid.Row="1" Grid.ColumnSpan="2" Orientation="Horizontal" HorizontalAlignment="Right">
<Button Content="Save" HorizontalAlignment="Right" Margin="5" IsEnabled="{Binding IsDirty}" />
<Button Content="Cancel" HorizontalAlignment="Right" Margin="5" IsEnabled="{Binding IsDirty}" Click="Cancel_Click"/>
<Button Content="Add" HorizontalAlignment="Right" Margin="5" IsEnabled="{Binding IsClean}"/>
</StackPanel>
</Grid>
</Window>
一个测试实体类:
public class Entity : INotifyPropertyChanged
{
private string _name;
private bool _isDirty = false;
public string Name
{
get { return _name; }
set
{
if(!IsDirty)
IsDirty = (value != _name);
_name = value;
RaisePropertyChanged("Name");
}
}
public bool IsDirty
{
get{ return _isDirty; }
set{
_isDirty = value;
RaisePropertyChanged("IsDirty");
RaisePropertyChanged("IsClean");
}
}
public bool IsClean
{
get { return !_isDirty; }
}
#region INotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyChanged;
protected void RaisePropertyChanged(string propertyName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
#endregion
}
以及窗口背后的代码:
namespace Test
{
public partial class EditTesting : Window
{
private Entity _myEntity;
public EditTesting()
{
InitializeComponent();
_myEntity = new Entity();
this.DataContext = _myEntity;
}
private void Cancel_Click(object sender, RoutedEventArgs e)
{
_myEntity.Name = string.Empty;
_myEntity.IsDirty = false;
}
}
}