在MVVM中插入/编辑时执行操作

时间:2016-04-18 21:59:36

标签: c# wpf mvvm datagrid

我正在使用C#,WPF和MVVM开发一个简单的CRUD。我正在使用DataGrid进行导航,Databounded Textboxes,一个“New”按钮用于插入,用户只需更改文本框值即可更改数据,最后点击“保存”按钮。

现在,我可以在单击“新建”按钮后轻松禁用DataGrid,并在单击“保存”按钮后重新启用。

但是,版本怎么样?我想在编辑时禁用DataGrid,但我不知道我是如何在MVVM中执行的。

  1. 我是在View中做的,我从Textboxes看一些“PropertyChanged”?
  2. 我是在ViewModel中做的,我从Entity属性看一些“PropertyChanged”(我已经为我的实体实现了INotifyPropertyChanged)?
  3. 另一种选择?

1 个答案:

答案 0 :(得分:1)

默认情况下,您可以将文本框设置为只读,并且仅在用户输入editcreate new状态时启用它们。

顺便说一句,当DataGrid支持CRUD接口时,你不应该实现CRUD接口。

编辑:帮助您可视化的代码

<强> XAML

<__CONTAINER__.Resources>
    <Style x:Key="CrudTextBoxStyle"
           BasedOn="{StaticResource {x:Type TextBox}}"
           TargetType="TextBox">
        <Setter Property="IsEnabled" Value="False" />
        <Style.Triggers>
            <DataTrigger Binding="{Binding EditMode}" Value="CreateNew">
                <Setter Property="IsEnabled" Value="True" />
            </DataTrigger>
            <DataTrigger Binding="{Binding EditMode}" Value="Edit">
                <Setter Property="IsEnabled" Value="True" />
            </DataTrigger>
        </Style.Triggers>
    </Style>
</__CONTAINER__.Resources>


<DataGrid IsReadOnly="True"
          ItemsSource="{Binding Records}"
          SelectedItem="{Binding CurrentRecord}"
          SelectionMode="Single"
          SelectionUnit="FullRow" />

<Button Content="Create New" />
<Button Content="Edit" />
<Button Content="Save" />
<Button Content="Cancel" />

<TextBox Style="{StaticResource CrudTextBoxStyle}" Text="{Binding CurrentRecord.TextProperty1}" />
<TextBox Style="{StaticResource CrudTextBoxStyle}" Text="{Binding CurrentRecord.TextProperty2}" />

代码

class CrudViewModel
{
    // you should use the full implementation with INPC
    public Record CurrentRecord { get; set; }
    public IList<Record> Records { get; set; }
    public EditMode EditMode { get; set; }

    private void CreateNewImpl()
    {
        CurrentRecord = new Record();
        EditMode = EditMode.CreateNew;
    }
    private void EditImpl()
    {
        EditMode = EditMode.Edit;
    }
    private void SaveImpl()
    {
        if (EditMode == EditMode.CreateNew)
        {
            Records.Add(CurrentRecord);
        }

        EditMode = EditMode.View;
    }
}

enum EditMode
{
    View, CreateNew, Edit
}
相关问题