FallbackValue 如何与多重绑定配合使用?
我问是因为它似乎不起作用。
假设我们要绑定到以下对象:
public class HurrDurr
{
public string Hurr {get{return null;}}
public string Durr {get{return null;}}
}
那么,如果我们对此使用 MultiBinding ,则会显示回退值,对吧?
<TextBlock>
<TextBlock.Text>
<MultiBinding StringFormat="{}{0} to the {1}"
FallbackValue="Not set! It works as expected!)">
<Binding Path="Hurr"/>
<Binding Path="Durr"/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
然而结果实际上是“到”。 即使强制绑定返回 DependencyProperty.UnsetValue
也不起作用:
<TextBlock xmnlns:base="clr-namespace:System.Windows;assembly=WindowsBase">
<TextBlock.Text>
<MultiBinding StringFormat="{}{0} to the {1}"
FallbackValue="Not set! It works as expected!)">
<Binding Path="Hurr"
FallbackValue="{x:Static base:DependencyProperty.UnsetValue}" />
<Binding Path="Durr"
FallbackValue="{x:Static base:DependencyProperty.UnsetValue}" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
对 TargetNullValue 进行了相同的尝试,这也完全失败了。
因此,MultiBinding 似乎永远不会使用FallbackValue。这是真的吗,还是我错过了什么?
再乱搞一下,我发现转换器可以返回我需要的 UnsetValue:
class MultiValueFailConverter : IMultiValueConverter
{
public object Convert(
object[] values,
Type targetType,
object parameter,
System.Globalization.CultureInfo culture)
{
if (values == null ||
values.Length != 2 ||
values.Any(x=>x == null))
return System.Windows.DependencyProperty.UnsetValue;
return values;
}
public object[] ConvertBack(
object value,
Type[] targetTypes,
object parameter,
System.Globalization.CultureInfo culture)
{
throw new NotImplementedException("Too complex hurt brain.");
}
}
但是,这似乎是一个肮脏的黑客行为。我认为框架中应该考虑到这样的场景。但是,我在 Reflector 中找不到任何内容。
I ask because it doesn't seem to work.
Assume we're binding to the following object:
public class HurrDurr
{
public string Hurr {get{return null;}}
public string Durr {get{return null;}}
}
Well, it would appear that if we used a MultiBinding against this the fallback value would be shown, right?
<TextBlock>
<TextBlock.Text>
<MultiBinding StringFormat="{}{0} to the {1}"
FallbackValue="Not set! It works as expected!)">
<Binding Path="Hurr"/>
<Binding Path="Durr"/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
However the result is, in fact, " to the ".
Even forcing the bindings to return DependencyProperty.UnsetValue
doesn't work:
<TextBlock xmnlns:base="clr-namespace:System.Windows;assembly=WindowsBase">
<TextBlock.Text>
<MultiBinding StringFormat="{}{0} to the {1}"
FallbackValue="Not set! It works as expected!)">
<Binding Path="Hurr"
FallbackValue="{x:Static base:DependencyProperty.UnsetValue}" />
<Binding Path="Durr"
FallbackValue="{x:Static base:DependencyProperty.UnsetValue}" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
Tried the same with TargetNullValue, which was also a bust all the way around.
So it appears that MultiBinding will never ever use FallbackValue. Is this true, or am I missing something?
A little more messing around and I found that a converter can return the UnsetValue I need:
class MultiValueFailConverter : IMultiValueConverter
{
public object Convert(
object[] values,
Type targetType,
object parameter,
System.Globalization.CultureInfo culture)
{
if (values == null ||
values.Length != 2 ||
values.Any(x=>x == null))
return System.Windows.DependencyProperty.UnsetValue;
return values;
}
public object[] ConvertBack(
object value,
Type[] targetTypes,
object parameter,
System.Globalization.CultureInfo culture)
{
throw new NotImplementedException("Too complex hurt brain.");
}
}
However, this seems like a dirty filthy hack. I'd think a scenario like this would be accounted for in the framework. I can't find anything in Reflector, however.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
这是一个有点老的问题,但它需要一些解释。
来自 FallbackValue 文档:
在提供的示例中,绑定成功解析为
Hurr
和Durr
属性。 Null 是字符串的有效值,这意味着绑定有效。换句话说,当绑定无法返回值并且在提供的示例中绑定确实提供了有效值时,将使用 FallbackValue。
以以下基于原始示例的每个片段为例:
示例 1
Hurr 和 Durr 属性已正确绑定; null 是一个有效值,并且 FallbackValue 将永远不会被看到。
示例 2
Hurr 和 Durr 属性未正确绑定;将看到 FallbackValue。
示例 3
如果一个绑定路径无效,则会看到 FallbackValue。
示例 4
与前面的示例一样,绑定是正确的,因此不会使用 FallbackValue。此外,
MultiBinding
父级的每个子Binding
属性的 FallbackValue 应引用用于 MultiBinding 的目标属性的 FallbackValue,而不是用于子 Bindings 。示例 5
即使
Binding
属性中未提供路径,绑定仍然有效,因为绑定将使用它绑定到的任何对象。示例 6
最后,如果将转换器添加到任何 Binding 属性以强制 UnsetValue,则将看到 MultiBinding FallbackValue:
Converter
XAML
This is a bit of an old question, but it could use some explanation.
From the FallbackValue documentation:
In the example provided, the binding successfully resolves to the
Hurr
andDurr
properties. Null is valid value for a string which means the binding is valid.In other words, the FallbackValue is used when the binding is unable to return a value and in the example provided, the binding does provide a valid value.
Take for example each of the following snippets that are based off the original example:
Example 1
The Hurr and Durr properties are bound correctly; null is a valid value and the FallbackValue will never be seen.
Example 2
The Hurr and Durr properties are not bound correctly; the FallbackValue will be seen.
Example 3
If one binding path is invalid, then the FallbackValue will be seen.
Example 4
As with previous examples, the binding is correct, so the FallbackValue will not be used. Further, the FallbackValue for each of the child
Binding
properties of theMultiBinding
parent should refer to a FallbackValue to be used for the target property of the MultiBinding, not for the child Bindings.Example 5
The binding is still valid even though a path is not provided in
Binding
properties since the binding will use whatever object it is bound to.Example 6
Finally, if a converter is added to any of the Binding properties to force an UnsetValue, then the MultiBinding FallbackValue will be seen:
Converter
XAML