c# - 所需的数据注释无法使用 XAML
问题描述
我使用 WPF/XAML(第一次使用这种技术进行编码),当用户没有选择组合框中的任何选项时,我试图发送错误消息。
这是到目前为止的代码:
在我的后端我使用这样的实体:
public class Scanner : ValidationBase
{
private int _id;
private string _name;
//[Range(1, int.MaxValue,ErrorMessageResourceType = typeof(Scanner), ErrorMessageResourceName = "ScannerConfigurationInfo_Required")]
public int Id
{
get { return _id; }
set { SetProperty(ref _id, value); }
}
[Required(ErrorMessageResourceName = "ScannerConfigurationInfo_Required")]
public string Name
{
get { return _name; }
set { SetProperty(ref _name, value); }
}
}
这是我的 ViewModel(为简单起见,我采用了不影响这个问题的部分代码):
class ScannerSettingsViewModel : ModalViewModelBase, IScannerSettingsViewModel
{
private const string SCANNER_ID = "ScannerId";
private ObservableCollection<Scanner> _availableScanners;
private Scanner _scannerSelected;
public AwaitableDelegateCommand SaveCommand { get; private set; }
public AwaitableDelegateCommand CancelCommand { get; private set; }
[Required(ErrorMessageResourceName = "ScannerConfigurationInfo_Required")]
public Scanner ScannerSelected
{
get { return _scannerSelected; }
set { SetProperty(ref _scannerSelected, value); }
}
public ObservableCollection<Scanner> AvailableScanners
{
get { return _availableScanners; }
set { SetProperty(ref _availableScanners, value); }
}
//Services
private readonly INavigationService _navigation;
private readonly ICheckDirectService _checkDirectService;
private readonly ISession _session;
public ScannerSettingsViewModel(INavigationService navigation, ISession session,
ICheckDirectService checkDirectService)
{
_navigation = navigation;
_session = session;
_checkDirectService = checkDirectService;
SaveCommand = new AwaitableDelegateCommand(SaveCommand_Execute);
CancelCommand = new AwaitableDelegateCommand(CancelCommand_Execute);
}
private async Task SaveCommand_Execute()
{
await ScannerSelected.FireValidation();
if (ScannerSelected.HasErrors)
{
return;
}
_session.Computer.Settings[SCANNER_ID] = ScannerSelected.Id.ToString();
await _session.Computer.Settings.SaveChanges();
await CloseDialog();
}
}
这是我的 XAML(同样,为了简单起见,我只选择了与问题相对应的部分):
<ComboBox Grid.Row ="1" ItemsSource="{Binding AvailableScanners}"
SelectedItem="{Binding ScannerConfigurationInfo.ScannerSetting, Mode=TwoWay, ValidatesOnDataErrors=True}"
SelectedValue="{Binding ScannerConfigurationInfo.ScannerSetting.Name, Mode=TwoWay, ValidatesOnDataErrors=True}"
Margin="20 50 20 50"
md:HintAssist.Hint="{l:LocText ScannerConfiguration_Model}"
DisplayMemberPath="Name"
SelectedValuePath="Name"
Style="{DynamicResource ComboboxDynamic}">
</ComboBox>
因此,组合框不会默认选择任何选项(这是有意的),其想法是,有一个保存按钮可以触发该SaveCommand_Execute
方法,它确实会在 中带来错误.HasErrors
,但不会“绘制它”前端。
解决方案
问题出在我ComboBox
的SelectedValue
, SelectedItem
. 那些指向另一个属性而不是SelectedScanner
and onDisplayMemberPath
并且SelectedValuePath
指向 onName
而不是Id
推荐阅读
- mysql - 如何在 Laravel 中获得生日?
- java - 如何通过命令行将参数传递给testng xml
- linux - 使用 linux 终端通过 SSH 连接到 amazon Lightsail 实例
- numpy - 从销售 df.csv 绘制历史数据的问题
- message - SAP ABAP 帮助:用户应根据消息中的设置获取字段名称或标签
- javascript - Javascript:检查类是否因未输入必填字段条目而更改
- c++ - 将自定义函数传递到基本抽象类以延迟执行
- javascript - 如何在 NodeJS(expressJS)中暂停 MySQL 数据库事务?
- python - SQLAlchemy:部分指定的关系
- apache-kafka - 使用 kafka-python 时定期轮询 Kafka 消费者的最佳方式是什么?