0

私の WPF ウィンドウは、Entity Framework データ コンテキスト (CollectionViewSource) に直接バインドします。ユーザーは、レコードが見つかるとすぐに編集を開始します。フォームが汚れたら、[追加] ボタンを無効にして、[保存] ボタンと [元に戻す] ボタンを有効にします。バインディングまたはイベントを使用してこれを行う簡単な方法はありますか?

私はMVVMを使用していません。最初に Entity Framework データベースを使用し、EF デザイナーを使用します。すべてのフィールドにコードを追加することは避けたいと思っています。データベースはかなり大きいです。

4

1 に答える 1

0

必要に応じて、イベントなしでこれを行うことができます。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;
    }       
  }
}
于 2013-02-15T16:32:44.150 に答える