2012-05-30 44 views
1

我有什么应该是一个比较简单的问题,但我不能在任何地方找到答案。我在xaml的UserControl的资源部分声明了一个转换器。该转换器有一个属性,我已经设置了要传入“this”的位置,也就是名为EventTagger的UserControl。在结合可以正常用户的ElementName =“EventTagger”至少主要用户控件的访问性能,但我无法弄清楚如何做到这一点作为一个属性的转换器,因为我不能在这里使用的绑定。我也会在这里传递DataContext的内容,但无法弄清楚如何传递。思考?传递的用户控件作为参数传递给资源在XAML

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

您可以使用转换器参数? – CodingGorilla

+0

我不这么认为,因为我不认为你可以在转换器参数中使用绑定。 – dbromberg

+0

不,你是对的,因为转换参数是绑定本身的一部分。那么你只需要在你的转换器上设置一个属性?我想你上面的XAML对我来说不是很清楚你想要做什么。 – CodingGorilla

回答

2

转换器将不会有任何DataContext所以即使你IValueConverterDependencyObject派生并标注器是一个DependencyProperty,你将无法使用DataContextRelativeSourceElementName绑定它。只有Source会起作用(在你的情况下这不太好)。

您可以使用x:Reference代替

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

如果您使用Visual Studio 2010的设计,你会得到一个错误说

服务提供商缺少INameResolver服务

这只是一个设计师的错误,它可以按照连接描述的方式进行处理:
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); 
    } 
} 
+0

太棒了!这像一个魅力。以前从未听说过x:Reference标签。谢谢! – dbromberg

0

因此,基于该意见,会是这样的工作:

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

Tagger属性应该是一个DependencyProperty因此它可以妥善处理绑定,然后"{Binding}"只是意味着“结合当前数据上下文“。

更普遍的回答你的问题是,你可以对你的转换器的公共属性,你可以在XAML中设置这些属性,因为我有我的样本上面。

+0

我不相信这会起作用,因为Converter不是一个DependencyObject,所以你不能拥有DependencyProperties。 – dbromberg

+0

如果需要,您可以将它设置为“DependencyObject”,您只需从“DependencyObject”继承。 – CodingGorilla

相关问题