使用 ValueConverter 绑定 - ConvertBack 参数始终为 null

Binding using ValueConverter - ConvertBack Parameter always null

我有一个绑定到问题的控件,该问题有很多可能的选项。每个选项都可以有一个响应。

示例:

Question: Will it fit in a shoe box?

Options: Yes, No, Maybe

Response: options[0].Response = new Response()

  • Meaning that the first option has a response, therefore it has been answered...

对于这种情况,我使用复选框表示。如果选中,则回答,如果没有,则响应为空。我希望这能说明我的意图。

但是我在绑定方面遇到了问题,因为我无法将响应输入到选项中。我以为我可以使用转换参数,但这似乎也不起作用..

这就是我绑定到复选框的方式:

<CheckBox  Content="{Binding Text}" 
           IsChecked="{Binding Response, 
                      Mode=TwoWay,  
                      Converter={StaticResource isQuestionResponseNullConverter}, 
                       ConverterParameter={Binding Response}}"
            />

所以这是带有我的值转换器的 CheckBox,它使用以下一种方式工作:

public object Convert(object value, Type targetType, object parameter, string language)
    {
        IResponse response = (IResponse )value;

        if (response== null)
        {
            false;
        }
        return true;
    }  

但是,我想使用 ConvertBack 方法重新绑定,这样如果选中该复选框,该问题响应的绑定将是 CheckBox 绑定上下文的绑定。我以为我可以使用上面 XAML 中所示的转换器参数来执行此操作,但是该参数似乎为空,我做错了吗?

我已阅读此内容,一些消息来源说需要 DependencyObject,但我不明白为什么,这肯定是 ConvertBack 的用途?

 public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        if ((bool)value == true)
        {
            return parameter; //<-- Always null.. 
        }
        else
        {
            return null;
        }
    }

转换器应该是:

public class isQuestionResponseNullConverter : DependencyObject, IValueConverter
{

    public object Parameter
    {
        get { return (object)GetValue(ParameterProperty); }
        set { SetValue(ParameterProperty, value); }
    }
    public static readonly DependencyProperty ParameterProperty =
        DependencyProperty.Register("Parameter", typeof(object), typeof(isQuestionResponseNullConverter), new PropertyMetadata(null));



    public object Convert(object value, Type targetType, object parameter, string language)
    {
        IResponse response = (IResponse)value;

        if (response == null)
        {
            return false;
        }
        return true;

    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        if ((bool)value == true)
        {
            return Parameter; //Get Parameter
        }
        else
        {
            return null;
        }

    }
}

并且在 XAML

  <Page.Resources>
    <local:isQuestionResponseNullConverter x:Key="isQuestionResponseNullConverter" Parameter="{Binding Response}"/>
</Page.Resources>

<Grid x:Name="Grid_Master" Background="Red">

    <CheckBox VerticalAlignment="Top"  Content="{Binding Text}" 
       IsChecked="{Binding Response, Mode=TwoWay,  Converter={StaticResource isQuestionResponseNullConverter}}"/>

</Grid>

现在在后面的方法中你得到了参数!

希望您觉得它易于使用且有用