我已经实现了界面 IValueConverter ,如图here所示,我将现在放在与我的代码隐藏相同的文件中XAML(两个类,都在相同的命名空间中,但实现 IValueConverter 并继承 Window )。
public class BamseGurka : IValueConverter
{
public object Convert(object v, Type t, object p, CultureInfo c) { ... }
public object ConvertBack(object v, Type t, object p, CultureInfo c) { ... }
}
在XAML中,我添加了一个标签,其可见性与需要转换的结果相关联,如here - "how to use value converter in XAML"所示。
<Label Name="ErrorMessage" ...
Visibility="{Binding Converter={StaticResource BamseConverter}}" >
由于我想要使用真正的自定义转换器,而不是微软预测的转换器(没有布尔,整数等),我需要参考我的实现(与例如 BoolToVisibilityConverter 相反)。我希望intellisense能给我很好的建议,但我最后在父元素(或窗口或应用程序)中添加了一个资源。
<StackPanel.Resources>
<ComboCellBindingConverter x:Key="BamseConverter" />
</StackPanel.Resources>
这引发了两个问题 - 首先是为什么我会得到(以及是什么) ComboCellBindingConverter 。其次,我应该把它放在那里(因为那个符号无法解决,我还需要指向我的实现)?
偷偷摸摸,我试图规避如下,但这只会导致同样的错误。
<StackPanel.Resources>
<BamseGurka x:Key="BamseConverter" />
</StackPanel.Resources>
使用intellisense,我在window标签和下面的设置中找到了一个新属性。
xmlns:blopp="clr-namespace:The.Actual.Namespace" ...
<StackPanel.Resources>
<blopp:BamseGurka x:Key="BamseConverter" />
</StackPanel.Resources>
现在,它抱怨 BamseGurka 不在提到的命名空间中,这是一个大胆的谎言,因为它是!只是为了好玩,当我将 BamseGurka 换成原始类的名称(同一个文件中的另一个,还记得吗?)时,错误消失了。
所以我在这里不知所措。 Haven之前没有使用过这样的自定义转换器。建议?如果 DataContext null ,谷歌给了我很多东西,但在转换器方面则更好。
答案 0 :(得分:0)
例如,如果您将转换器放在根文件夹中“转换器”文件夹中的单独文件中,您可以在字典中注册它:
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:converters="clr-namespace:BamseGurka.Converters">
<converters:BamseConverter x:Name="BamseConverter" />
</ResourceDictionary>
然后你就像你做的那样绑定它:
<Label Name="ErrorMessage" ...
Visibility="{Binding Converter={StaticResource BamseConverter}}" >
当然,请记住设置在Visibility中绑定的属性,因为此时它不起作用。