System.Windows.Data.MultiBinding.Converter引发异常
本文关键字:异常 Converter MultiBinding Windows Data System | 更新日期: 2023-09-27 18:26:41
尝试在我的xaml文档中实现一些代码隐藏。这里的想法是,后面的代码将比较两个值,如果它们的字符串相等,则返回True,但我一直得到System.Windows.Data.MultiBinding.Converter抛出了一个异常
<Grid xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:cvm="clr-namespace:Mashup;assembly=CompareValuesMashup"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase"
xmlns:dat="clr-namespace:System.Windows.Data;assembly=PresentationFramework"
xmlns:xlink="http://www.w3.org/1999/xlink">
<Grid.Resources>
<cvm:CompareTwoValues x:Key="CompareValues" />
</Grid.Resources>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="1*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="1*" />
</Grid.RowDefinitions>
<StackPanel Width="200" HorizontalAlignment="Left" Margin="5">
<!-- values to be processed by the converter -->
<TextBox Name="value1" Height="50" Margin="0,0,0,0" />
<TextBox Name="value2" Height="50" Margin="0,15,0,0" />
<!-- Compare value1 and value2-->
<TextBox Name="result1" Height="50" Margin="0,15,0,0">
<TextBox.Text>
<MultiBinding Converter="{StaticResource CompareValues}">
<Binding ElementName="value1" Path="Text" />
<Binding ElementName="value2" Path="Text" />
</MultiBinding>
</TextBox.Text>
</TextBox>
</StackPanel>
</Grid>
这是背后的代码。我不确定这个例外是从哪里来的。
namespace Mashup
{
public class CompareTwoValues
{
public CompareTwoValues()
{
base..ctor();
}
public bool Execute(string value1, string value2)
{
return value1 == value2;
}
}
}
CompareTwoValues
不实现IMultiValueConverter
。它没有实现任何接口或基类,所以我也不希望它在类似的场景中被框架使用。
它需要实现框架使用的接口:
public class CompareTwoValues : IMultiValueConverter
{
public CompareTwoValues()
{
base..ctor();
}
public bool Execute(string value1, string value2)
{
return value1 == value2;
}
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
// convert the values to the target type
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
// convert the value back to the set of target types
}
}
目前,类比较值,但它没有转换任何内容。从现有的类逻辑中还不完全清楚这种转换会是什么样子,但它需要发生才能在这种上下文中使用。
将多个值转换为单个值的示例可能类似于:
return String.Concat(values[0], " ", values[1]);
转换回来可能类似于:
return (value as string).Split(' ');
(例如,如果值是字符串,而所需的结果是一个连接的空格分隔字符串。)
实现单个ValueConverter不是更好吗?像这样:
public class CompareValues: IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return value == parameter;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
然后使用
<!-- Compare value1 and value2-->
<TextBox Name="result1" Height="50" Margin="0,15,0,0">
<TextBox.Text>
<Binding Converter="{StaticResource CompareValues}" ElementName="value1" Path="Text">
<Binding.ConverterParameter>
<Binding Path="Text" ElementName="value2"/>
</Binding.ConverterParameter>
</MultiBinding>
</TextBox.Text>
</TextBox>
@david这起到了作用。我需要返回一个可以用来触发样式的字符串。
public class IsEqual : IMultiValueConverter
{
public object Convert(object[] values, Type targetTypes, object parameter, CultureInfo culture)
{
if (values[0] == "")
return string.Format("blank");
// returns yes if equal
else if (string.Equals(values[0], values[1]))
return string.Format("yes");
//returns no if not equal
else
return String.Format("no");
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
return null;
}
}