无法编辑WPF DataGrid DataGridTextColumn中的成员

时间:2016-02-07 17:48:47

标签: c# wpf xaml datagrid

我正在开发一个小型WPF应用程序,我想向用户提供一个字符串列表,供他们编辑,添加或删除。

我做的第一件事是创建一个带有视图模型更改通知的基类:

  public abstract class BaseViewModel : INotifyPropertyChanged
  {
    public event PropertyChangedEventHandler PropertyChanged;

    [NotifyPropertyChangedInvocator]
    protected virtual void RaisePropertyChanged([CallerMemberName] string propertyName = null)
    {
      this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
  }

在此之后,我为绑定/更改通知的字符串创建了一个包装器:

  public class StringViewModel : BaseViewModel
  {
    private string value;

    public string Value
    {
      get { return this.value; }
      set
      {
        if (value == this.value) return;
        this.value = value;
        this.RaisePropertyChanged(nameof(this.Value));
      }
    }
  }

然后我有一个使用这个类的视图模型(我已经省略了其他不相关的成员):

  public class UserSettingsDataViewModel : BaseViewModel
  {
    private ObservableCollection<StringViewModel> blacklistedFiles;

    public ObservableCollection<StringViewModel> BlacklistedFiles
    {
      get { return this.blacklistedFiles; }
      set
      {
        if (Equals(value, this.blacklistedFiles)) return;
        this.blacklistedFiles = value;
        this.RaisePropertyChanged(nameof(this.BlacklistedFiles));
      }
    }
  }

最后,我已将此信息包含在我的XAML中,用于相关屏幕:

<WrapPanel>
  <Label>Blacklisted files</Label>
  <DataGrid ItemsSource="{Binding Data.BlacklistedFiles}" AutoGenerateColumns="False">
    <DataGrid.Columns>
      <DataGridTextColumn Binding="{Binding Value}" Header="File name" />
      <DataGridTemplateColumn Header="Remove">
        <DataGridTemplateColumn.CellTemplate>
          <DataTemplate>
            <Button Content="Remove" Command="Delete" />
          </DataTemplate>
        </DataGridTemplateColumn.CellTemplate>
      </DataGridTemplateColumn>
    </DataGrid.Columns>
  </DataGrid>
</WrapPanel>

一切正常,但我无法编辑新成员或现有成员的值。我可以单击单元格并让它进入编辑模式,但按键不会做任何事情(除了我似乎能够添加或删除空格)。我觉得必须有一个直截了当的解决办法,但这是在逃避我。

1 个答案:

答案 0 :(得分:1)

原因是这个WPF表单存在于Windows窗体应用程序中。要解决的步骤是:

  • 添加对WindowsFormsIntegration库的引用。

  • 在创建窗口的类中,添加using语句using Systems.Windows.Forms.Integration

  • 在窗口上调用ElementHost.EnableModelessKeyboardInterop

我必须对this answer给予一些赞扬,这有助于我弄清楚出了什么问题。