繁体   English   中英

使用Binding作为ConverterParameter

[英]Use Binding as ConverterParameter

我正在尝试使用值绑定作为转换器参数,如下面的代码片段所示:

<Element
  Attribute="{Binding Value,
              Converter={StaticResource EqualityConverter},
              ConverterParameter={Binding CompareTo}}" />

问题是,使用Binding实例作为转换器参数( CompareTo )调用EqualityConverter::Convert()方法,而不是绑定的具体值。

有更聪明的方法来解决它吗? 我显然可以在我的视图模型中提供转换后的属性,但我想知道是否有类似的工作解决方案。

另一种可能更简单的方法是在转换器本身上定义一个可绑定属性。

public class CompareConverter: IValueConverter, INotifyPropertyChanged{
  private ComparisonType _comparison = ComparisonType.Equals;
  public ComparisonType Comparison {
    get {return _comparison; }
    set { _comparison = value; OnPropertyChanged(); }
  }

  private string _compareTo = null;
  public string CompareTo {
    get {return _compareTo; }
    set { _compareTo = value; OnPropertyChanged(); }
  }

  public event PropertyChangedEventHandler PropertyChanged;

  protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
  { 
    if (PropertyChanged != null) 
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
  } 

  public object Convert (object value, Type targetType, object parameter, 
     System.Globalization.CultureInfo culture)
  {
    bool result = false;
    switch (Comparison)...
    return result;
  } 
  ...
}

您也可以通过继承BindableObject并实现可绑定属性来完成此操作,如果绑定上下文未被携带到资源中,您可能需要这样做。 如果是这种情况,您可以在构造函数中从代码后面设置一次,在调用Initialize方法之后。

你的xaml看起来像这样:

..
<ResourceDictionary>
  <myPrefix:CompareConverter x:Key="compareToY" Comparison="Equals" CompareTo="{Binding... }"/>
</ResourceDictionary>
...
<Control Value="{Binding X, Converter={StaticResource compareToY}}"/>

可能需要一些调整,结果应该比多绑定更干净

我正在努力解决同样的问题而没有得到我想要的数据。 你不能绑定到“converterParameter”,这就是它在当前日期的制作方式。 但我真的想得到一些发送到参数的数据。 所以我找到了一个简单但有效的解决方案,我希望它也适合你。 首先给出CompareTo ax:Name =“CompareTo”或者你想要的任何东西。

         <Element
          Attribute="{Binding Value,
          Converter={StaticResource EqualityConverter},
          ConverterParameter={x:reference CompareTo}}" />

通过x:引用它实际上现在发送一些数据,你只需抓住它。 对我来说,我需要的值是“字符串”值,以便我可以做某些“如果”语句。 所以你可以做类似的事情:

    if(CompareTo == "myCoolString")
    {
      Value = "Well i guess i'm not so cool!"
    }

这是我从参数中获取数据的方式:

   public class MyConverter : IValueConverter
    {

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (parameter != null)
        {
            try
            {
                var image = parameter as Image;
                var src = image.Source as FileImageSource;

                if (src.File.ToString() == "coolimage.png")
                {
                    return "thumbsup.png";
                }
            }
            catch
            {
            }
        } 
    }

在我的情况下,我正在使用和图像,并需要知道一个图像是“A”,然后“B”需要转换为图像“C”。 这应该与其他对象一起使用。 运气不错,这会让你更接近一种简单的“多重绑定”和回答。

希望这是我在Stackoverflow上的第一篇文章有​​用!

ConverterParameter不是依赖属性,因此您将无法绑定任何属性。 但是,您可以尝试将MultiBinding与MultiValueConverter一起使用。

码:

<TextBox>
    <TextBox.Text>
        <MultiBinding Converter="{StaticResource MultiValueConverter}">
            <Binding Path="property1"/>
            <Binding Path="property2"/>
        </MultiBinding>
    </TextBox.Text>
</TextBox>
public class MultiValueConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, 
           object parameter, System.Globalization.CultureInfo culture)
    {
         property1 = values[0];
         property2 = values[1];
         // Do your logic with the properties here.
    }
    public object[] ConvertBack(object value, Type[] targetTypes, 
           object parameter, System.Globalization.CultureInfo culture)
    {

    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM