1

我有一个应该是一个相对简单的问题,但我在任何地方都找不到答案。我在 xaml 的 UserControl 的资源部分中声明了一个转换器。该转换器有一个我已经设置的属性,我想在其中传递“this”,即名为 EventTagger 的 UserControl。在绑定中,您通常可以使用 ElementName="EventTagger" 访问至少主 UserControl 的属性,但我不知道如何将其作为转换器的属性,因为我不能在这里使用绑定。我也会在这里传递 DataContext 的内容,但也不知道如何传递它。想法?

<UserControl Name="EventTagger" ...>
    <UserControl.Resources>
        <TagFrameVerificationConverter x:Key="tagFrameVerificationConverter Tagger="?"/>
    </UserControl.Resources>
     ...
</UserControl>
4

2 回答 2

2

转换器不会有任何DataContext因此即使您IValueConverter派生自DependencyObject并且 Tagger 是DependencyProperty您将无法使用DataContext,RelativeSource或绑定它ElementName。只有Source会起作用(在你的情况下这不是很好)。

您可以x:Reference改用

<UserControl Name="EventTagger" ...>
    <UserControl.Resources>
        <TagFrameVerificationConverter x:Key="tagFrameVerificationConverter"
                                       Tagger="{x:Reference EventTagger}"/>
    </UserControl.Resources>
</UserControl>

如果您使用的是 VS2010 设计器,您会收到一条错误消息

服务提供者缺少 INameResolver 服务

这只是一个设计器错误,可以按照此处在 connect:
Visual Studio 2010 InvalidOperationException using x:Reference in WPF中的描述解决。
如果我们处于设计模式,我们会ProvideValue返回。null

[ContentProperty("Name")]
public class Reference : System.Windows.Markup.Reference
{
    private static DependencyObject _dependencyObject = new DependencyObject();
    public Reference()
        : base()
    { }

    public Reference(string name)
        : base(name)
    { }

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        if (DesignerProperties.GetIsInDesignMode(_dependencyObject) == true)
        {
            return null;
        }
        return base.ProvideValue(serviceProvider);
    }
}
于 2012-05-30T19:21:08.193 回答
0

因此,根据评论,这样的工作是否可行:

<UserControl Name="EventTagger" ...>
    <UserControl.Resources>
        <TagFrameVerificationConverter x:Key="tagFrameVerificationConverter" Tagger="{Binding}"/>
    </UserControl.Resources>
     ...
</UserControl>

您的Tagger属性应该是 aDependencyProperty以便它可以正确处理绑定,然后"{Binding}"仅表示“绑定到当前数据上下文”。

对您的问题的更一般的答案是,您可以在转换器上拥有公共属性,并且可以像在上面的示例中那样在 XAML 中设置这些属性。

于 2012-05-30T19:05:39.440 回答