在组合框中实现IDataErrorInfo

neo*_*neo 7 c# wpf mvvm

我在验证ComboBox使用时遇到问题IDataErrorInfo.

我设置了1个文本框和1个组合框,在运行程序时,第一个焦点在文本框上,当我按Tab键聚焦在我得到的组合框中时:

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" />
Run Code Online (Sandbox Code Playgroud)

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

这里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; }
}
Run Code Online (Sandbox Code Playgroud)

任何帮助将受到高度赞赏.请让我知道我可以添加的任何内容,以使其更清晰.

jom*_*k1e 3

我以前遇到过同样的问题,起初我怀疑我与 ComboBox SelectedValue 的绑定导致了问题。我尽了一切努力来调试程序,但没有帮助。直到我发现问题/错误是在 mahApps 上。以下是解决您的问题的一些步骤:

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

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

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

  2. 如果问题仍然存在,请尝试在 Visual Studio 2013 中重新迭代您的解决方案。您可以在此处下载。如果您已经使用 VS2013,请继续执行步骤 3。
  3. 重新安装 mahApps(确保您已删除旧 mahApps 的所有 .dll 和软件包)。转到程序包管理器控制台,键入:Install-Package MahApps.Metro -Pre
  4. 执行使用 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>
    
    Run Code Online (Sandbox Code Playgroud)
  5. 重新构建您的应用程序,让我们看看您得到了什么。

简短回答:彻底卸载 mahApps(即删除所有 DLL 和软件包)将解决该问题。完全卸载 mahApps 后,如果您想重试,可以通过 NuGet 或包管理器安装全新的 mahApps。请按照此处的说明进行操作。如果全部失败,请更新您的 VS,然后再次尝试更新 mahApps。

希望有帮助!