Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF使用空字符串调用值转换器_C#_Wpf - Fatal编程技术网

C# WPF使用空字符串调用值转换器

C# WPF使用空字符串调用值转换器,c#,wpf,C#,Wpf,在本例中,我有一个绑定到值列表的组合框,一个简单的ints数组。该控件指定了一个自定义的ItemTemplate来格式化其元素,而该元素又使用IValueConverter进行某些操作 有一种特殊情况会失败:如果组合框选择了一个元素,并且项目列表发生更改,则转换器的Convert将使用空字符串调用,而空字符串肯定不是绑定到我的控件的值之一。(请注意,我不是在谈论ConvertBack方法。) 我的问题是: 为什么调用IValueConverter时value是一个空字符串(“”),而控件从未绑定

在本例中,我有一个绑定到值列表的组合框,一个简单的
int
s数组。该控件指定了一个自定义的
ItemTemplate
来格式化其元素,而该元素又使用
IValueConverter
进行某些操作

有一种特殊情况会失败:如果
组合框
选择了一个元素,并且项目列表发生更改,则转换器的
Convert
将使用空字符串调用,而空字符串肯定不是绑定到我的控件的值之一。(请注意,我不是在谈论
ConvertBack
方法。)

我的问题是:

  • 为什么调用
    IValueConverter
    value
    是一个空字符串(
    “”
    ),而控件从未绑定任何字符串
  • 这个问题有哪些非黑客解决方案?(我可以将
    if(value为“”)return null;
    放在转换器中,它似乎可以消除错误,但我觉得它是在治疗症状,而不是原因。)

  • 这个问题可以通过一个只包含这3个文件的简单WPF项目(
    dotnet new WPF
    )重现(这个问题在.NET的框架和核心版本上都存在):

    MainWindow.xaml:

    
    
    MainWindow.xaml.cs:

    使用系统;
    使用System.Windows;
    名称空间测试
    {
    公共部分类主窗口:窗口
    {
    公共主窗口()
    {
    初始化组件();
    Selector.ItemsSource=newint[]{1,2,3};
    }
    私有无效按钮\u单击(对象发送者,路由目标e)
    {
    Selector.ItemsSource=newint[]{-1,-2,-3};
    }
    [状态线程]
    公共静态void Main(字符串[]args)
    {
    新建主窗口().ShowDialog();
    }
    }
    }
    
    最后是Converter.cs:

    使用系统;
    使用系统诊断;
    利用制度全球化;
    使用System.Windows.Data;
    名称空间测试
    {
    类转换器:IValueConverter
    {
    公共静态转换器实例{get;}=new Converter();
    公共对象转换(对象值、类型targetType、对象参数、CultureInfo区域性)
    {
    Assert(值为int);
    返回(2*(int)值).ToString();
    }
    公共对象转换回(对象值、类型targetType、对象参数、CultureInfo区域性)
    {
    抛出新的NotSupportedException();
    }
    }
    }
    

    这3个文件构成了一个展示这种行为的最小示例。如果单击“替换”按钮而没有首先从组合框中选择任何内容,则程序运行正常。但是,如果在单击按钮之前在组合框中选择了任何值,则转换器中的断言将失败,因为单击按钮后,转换器将被传递一个
    “”

    当当前选定的项目不在新设置的项目源中时,我尝试了您的代码。应更改选定的项目,对吗?因此,他们将所选项目更改为“”。这是您在应用程序运行的初始状态中看到的选定项目

    事实上,如果将选定项保留在新项源中,则它不会执行值为“”的转换。 考虑您的初始项源是

    Selector.ItemsSource = new int[] { 1, 2, 3 };
    
    现在,选择组合框中显示为4的第二个元素,然后单击“替换”以运行此操作

     Selector.ItemsSource = new int[]{ -1, 2, -3 };
    
    那么它将不会执行值为“”的转换器


    这里的问题是所选项目在新项目源中不存在,因此Combobox正在选择其默认值,并且您的Combobox的行为将与启动应用程序的方式相同。

    在应用程序中,此错误是由于将上一个项目保留在新列表中没有任何意义。