我正在开发一个小型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>
一切正常,但我无法编辑新成员或现有成员的值。我可以单击单元格并让它进入编辑模式,但按键不会做任何事情(除了我似乎能够添加或删除空格)。我觉得必须有一个直截了当的解决办法,但这是在逃避我。
答案 0 :(得分:1)
原因是这个WPF表单存在于Windows窗体应用程序中。要解决的步骤是:
添加对WindowsFormsIntegration库的引用。
在创建窗口的类中,添加using语句using Systems.Windows.Forms.Integration
。
在窗口上调用ElementHost.EnableModelessKeyboardInterop
。
我必须对this answer给予一些赞扬,这有助于我弄清楚出了什么问题。