使用绑定作为 ConverterParameter
Use Binding as ConverterParameter
我正在尝试使用值绑定作为转换器参数,如下面的代码片段所示:
<Element
Attribute="{Binding Value,
Converter={StaticResource EqualityConverter},
ConverterParameter={Binding CompareTo}}" />
问题是,调用 EqualityConverter::Convert()
方法时使用 Binding
的实例作为转换器参数 (CompareTo
),而不是绑定的具体值。
有没有更聪明的解决方法?我显然可以在我的视图模型中提供转换后的 属性,但我想知道是否有与上述解决方案类似的工作解决方案。
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)
{
}
}
另一种可能更简单的方法是在转换器本身上定义一个可绑定的属性。
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 一个 x:Name="CompareTo" 或任何你想给它起的名字。
<Element
Attribute="{Binding Value,
Converter={StaticResource EqualityConverter},
ConverterParameter={x:reference CompareTo}}" />
通过x:reference它现在实际上发送了一些数据,你只需要抓住它。对我来说,我需要的值是 "string" 值,以便我可以执行某些 "If" 语句。所以你可以做类似的事情:
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"。这也适用于其他对象。运气好的话,这会让您更接近一种简单化的 "Multibinding" 和答案。
希望这对我有帮助,因为这是我在 Whosebug 上的第一个 post!
我正在尝试使用值绑定作为转换器参数,如下面的代码片段所示:
<Element
Attribute="{Binding Value,
Converter={StaticResource EqualityConverter},
ConverterParameter={Binding CompareTo}}" />
问题是,调用 EqualityConverter::Convert()
方法时使用 Binding
的实例作为转换器参数 (CompareTo
),而不是绑定的具体值。
有没有更聪明的解决方法?我显然可以在我的视图模型中提供转换后的 属性,但我想知道是否有与上述解决方案类似的工作解决方案。
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)
{
}
}
另一种可能更简单的方法是在转换器本身上定义一个可绑定的属性。
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 一个 x:Name="CompareTo" 或任何你想给它起的名字。
<Element
Attribute="{Binding Value,
Converter={StaticResource EqualityConverter},
ConverterParameter={x:reference CompareTo}}" />
通过x:reference它现在实际上发送了一些数据,你只需要抓住它。对我来说,我需要的值是 "string" 值,以便我可以执行某些 "If" 语句。所以你可以做类似的事情:
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"。这也适用于其他对象。运气好的话,这会让您更接近一种简单化的 "Multibinding" 和答案。
希望这对我有帮助,因为这是我在 Whosebug 上的第一个 post!