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的行为将与启动应用程序的方式相同。在应用程序中,此错误是由于将上一个项目保留在新列表中没有任何意义。