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;
    }
  }
}

System.Windows.Data.MultiBinding.Converter引发异常

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;
    }
}