在组合框中实现IDataErrorInfo
本文关键字:实现 IDataErrorInfo 组合 | 更新日期: 2023-09-27 17:54:07
我在使用IDataErrorInfo
验证ComboBox
时遇到问题。
我设置了1个文本框和1个组合框,在运行程序时,第一个焦点是在文本框上,当我按tab键聚焦在组合框中时,我得到:
InvalidOperationException: 'validationTooltip'名称无法在'System.Windows.Controls.ToolTip'的名称范围中找到。'
为了帮助你帮助我这里是我的XAML的一部分:
<Window.DataContext>
<ViewModels:MainWindowViewModel/>
</Window.DataContext>
<!-- Batch ID-->
<Label Content="Batch ID"
Height="28"
Margin="64,52,191,0" VerticalAlignment="Top" />
<TextBox Name="txtBatchId"
Text="{Binding BatchId, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}"
Margin="124,52,65,0" TabIndex="1" Height="26" VerticalAlignment="Top" />
<!-- Product -->
<Label Content="Product"
Height="28" Margin="54,81,191,0" VerticalAlignment="Top" />
<ComboBox Name="cmbProduct"
ItemsSource="{Binding Products}"
DisplayMemberPath="ProductName"
SelectedValuePath="ProductId"
SelectedValue="{Binding SelecteProductId, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}"
Height="23" Margin="124,81,65,0" VerticalAlignment="Top" TabIndex="2" />
这是ProductModel.cs
,用于数据绑定组合框:
public class ProductModel
{
public int ProductId {get;set;}
public int ProductName {get;set;}
public ProductModel(int prodId, string prodName)
{
ProductId = prodIdl;
ProductName = prodName;
}
}
这里是MainWindowViewModel.cs
实现INotifyPropertyChanged和IDataErrorInfo:
public class MainWindowViewModel : ViewModelBase, IDataErrorInfo
{
private string _batchId;
public string BatchId
{
get { return _batchId; }
set
{
_batchId = value;
OnPropertyChanged("BatchId");
}
}
private ObservableCollection<Product> _products = new ObservableCollection<Product>();
public IEnumerable<Product> Products {
get { return _products; }
}
private string _selectedProductId;
public string SelectedProductId
{
get { return _selectedProductId; }
set
{
_selectedProductId = value;
OnPropertyChanged("SelectedProductId");
}
}
public void PopulateProduct() {
....
}
public MainWindowViewModel()
{
PopulateProduct();
}
public string this[string columnName]
{
get
{
string result = string.Empty;
switch (columnName)
{
case "SelectedProductId":
if (SelectedProductId == null || SelectedProductId == "0")
{
result = "Please select a product";
}
break;
case "BatchId":
if (string.IsNullOrWhitespace(BatchId))
{
result = "Please input batch id";
}
break;
}
return result;
}
}
public string Error { get; private set; }
}
任何帮助将是非常感激的。
我以前遇到过同样的问题,起初我怀疑我与ComboBox SelectedValue的绑定导致了这个问题。我尽我所能调试这个程序,但没有帮助。直到我发现问题/bug是在mahApps上。以下是解决问题的一些步骤:
卸载/删除项目中的mahApps。重新构建您的项目,让我们看看您是否仍然遇到相同的错误。
1.1。如果问题仍然存在,请转步骤2。,否则继续步骤1.2。
1.2。如果通过移除mahApps解决了这个问题,你可以选择其他的布局包。或者如果你真的想使用mahApps。请忽略第1步。2,然后继续步骤1。3
- 如果问题仍然存在,请尝试在Visual Studio 2013中重复您的解决方案。你可以在这里下载。如果您已经使用VS2013,请继续执行步骤3。
- 重新安装mahApps(确保你已经删除了旧mahApps的所有.dll和包)。进入包管理器控制台键:安装包MahApps。地铁前
做使用mahApps所需的事情。窗口关闭前的标签ie。
</Controls:MetroWindow>
,确保你有这个:<Window.Resources> <ResourceDictionary> <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Colors.xaml" /> <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Fonts.xaml" /> <ResourceDictionary Source="pack://application:,,,/MahApps.Metro;component/Styles/Controls.xaml" /> </ResourceDictionary.MergedDictionaries> </ResourceDictionary> </Window.Resources>
重新构建应用程序,让我们看看你得到了什么
简短的回答:清洁卸载mahApps(即。移除所有dll和包)将修复这个问题。干净卸载mahApps后,如果您想再试一次,可以通过NuGet或Package Manager安装新的mahApps。按照这里的说明操作。如果都失败了,更新你的VS,然后再尝试更新mahApps。
希望有帮助!
尝试使用触发器显示验证错误并设置验证。
<Style x:Key="comboBoxInError" TargetType="{x:Type ComboBox}">
<Style.Triggers>
<Trigger Property="Validation.HasError" Value="true">
<Setter Property="ToolTip"
Value="{Binding RelativeSource={x:Static RelativeSource.Self},
Path=(Validation.Errors)[0].ErrorContent}"/>
<Setter Property="Validation.ErrorTemplate" Value={x:Null} />
</Trigger>
</Style.Triggers>
</Style>