具有依赖属性的UserControl

时间:2014-10-16 09:44:23

标签: c# xaml user-controls windows-store-apps dependency-properties

我创建了一个名为TagItem的UserControl类,它目前只包含一个名为mainButton的Button。

它有一个名为DisplayedTag的依赖项属性,它是Tag的类型(包含有关我的标签的数据的简单类)。我的目标是当用户从XAML设置DisplayedTag时,mainButton的文本应该更新为Tag的TagName。

TagItem中的代码:

    public Tag DisplayedTag
    {
        get { return (Tag)GetValue(DisplayedTagProperty); }
        set
        {
            SetValue(DisplayedTagProperty, value);   
        }
    }

    // Using a DependencyProperty as the backing store for MyProperty. 
    // This enables animation, styling, binding, etc...
    public static DependencyProperty DisplayedTagProperty =
        DependencyProperty.Register("DisplayedTag", 
            typeof(Tag), 
            typeof(TagItem), 
            new PropertyMetadata(new Tag(), 
                OnDisplayedTagPropertyChanged));


    private static void OnDisplayedTagPropertyChanged(DependencyObject source, 
        DependencyPropertyChangedEventArgs e)
    {
        // Put some update logic here...

        Tag tag = (Tag)e.NewValue;
        mainButton.Content = tag.TagName;

    }

在XAML中:

<local:TagItem DisplayedTag="{Binding}"/>

这不起作用,因为OnDisplayedTagPropertyChanged是静态的,而mainButton则不是。我可能在这里完全错误的轨道,并且非常欣赏解决这个简单问题的一些方向。

1 个答案:

答案 0 :(得分:2)

source回调的OnDisplayedTagPropertyChanged参数中,您将获得UserControl派生控件。您只需将其强制转换即可访问其成员mainButton

我为你的班级取了任何名字(不知道一切是否正确):

private static void OnDisplayedTagPropertyChanged(DependencyObject source, 
    DependencyPropertyChangedEventArgs e)
{
    MyUserControl ctrl = source as MyUserControl;
    if(ctrl == null) // should not happen
      return;

    Button b = ctrl.mainButton;

    Tag tag = (Tag)e.NewValue;
    mainButton.Content = tag.TagName;

}