在ComboBox中实现IDataErrorInfo

我有一个使用IDataErrorInfo验证ComboBox的问题。

我设置了1个文本框和1个组合框,在运行该程序时,第一个焦点位于文本框中,当我点击标签以关注组合框时,我得到:

InvalidOperationException:在'System.Windows.Controls.ToolTip'的名称范围中找不到'validationTooltip'名称。

为了帮助我,这里是我的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;
    }
}

这里是实现INotifyPropertyChanged和IDataErrorInfo的MainWindowViewModel.cs

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的绑定导致了这个问题。 我尽我所能去调试程序,但没有帮助。 直到我发现问题/错误在mahApps上。 以下是解决问题的一些步骤:

  • 在您的项目中卸载/删除mahApps。 重新构建你的项目,让我们看看你是否仍然遇到同样的错误。

    1.1。 如果问题仍然存在,请转到步骤2,如果不继续步骤1.2。

    1.2。 如果通过删除mahApps来解决问题,则可以选择其他布局软件包。 :))或者如果你真的想使用mahApps。 请忽略步骤编号。 2并继续步骤编号。 3

  • 如果问题仍然存在,请尝试在Visual Studio 2013中重新迭代您的解决方案。可以在此处下载。 如果您已经使用VS2013,请继续步骤3。
  • 重新安装mahApps(确保您已经删除了旧版mahApp的所有.dll和包)。 转到包管理器控制台密钥:安装包MahApps.Metro -Pre
  • 做所需的事情使用mahApps。 在关闭窗口标签之前,即。 </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,然后再次尝试更新mahApp。

    希望有所帮助!


    尝试使用触发器来显示验证错误并将组合框的Validation.ErrorTemplate设置为null:

    <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>
    
    链接地址: http://www.djcxy.com/p/78395.html

    上一篇: Implementing IDataErrorInfo in combobox

    下一篇: ansible 1.6 > using with