将XAML属性值设置为用户控件

时间:2010-07-05 23:12:05

标签: wpf wpf-controls binding

我在WPF中有一个用户控件,我希望从使用它的XAML中读取其中一个标签的文本。因此..

我的用户控制:

 <UserControl x:Class="muc">
        <Label Foreground="#FF7800" FontSize="20" FontWeight="Bold">          
             <Label.Content>
                <Binding ElementName="TestName" Path="." />
             </Label.Content>
        </Label>
 </UserControl>

然后使用它:

 <mycontorls:muc TestName="This is a test" />

但它不起作用...... 我怎样才能阅读这些属性?

4 个答案:

答案 0 :(得分:8)

我尝试了前两个答案以及我在代码中工作但不在XAML上工作(也不允许您在使用控件时看到设计视图中的更改)。

要让房产像其他任何房产一样工作,这里是完整的过程: (该示例添加了Nullable类型的依赖项属性,以在控件中显示为文本,如果为null则显示默认值)

  1. 在代码文件中:

    1.a定义依赖属性:

    public static readonly DependencyProperty MyNumberProperty = DependencyProperty.Register("MyNumber", typeof(Nullable<int>), typeof(MyUserControl), new PropertyMetadata(null, new PropertyChangedCallback(OnMyNumberChanged)));
    

    1.b实现OnMyNumberChanged回调:

    private static void OnMyNumberChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args){
        // When the color changes, set the icon color PlayButton
        MyUserControl muc = (MyUserControl)obj;
        Nullable<int> value = (Nullable<int>)args.NewValue;
        if (value != null)
        {
            muc.MyNumberTextBlock.Text = value.ToString();
        }
        else
        {
            muc.MyNumberTextBlock.Text = "N/A";
        }
    }
    

    1.c实现MyNumber属性(不依赖)以使用依赖属性以方便代码使用:

    public Nullable<int> MyNumber{
        get
        {
            return (Nullable<int>)GetValue(MyNumberProperty);
        }
        set
        {
            SetValue(MyNumberProperty, value);
            OnTargetPowerChanged(this, new DependencyPropertyChangedEventArgs(TargetPowerProperty, value, value));    // Old value irrelevant.
        }
    }
    
  2. 在XAML文件中,将TextBlock控件的文本绑定到属性(非依赖项)以获取依赖项属性的默认值,以防它未被控件的用户设置(假设您调用了根元素)用户控件“RootElement”):

  3. 此代码:

     < TextBlock Name="MyNumberTextBlock" Text="{Binding MyNumber, ElementName=RootElement}"/>
    

答案 1 :(得分:4)

如果为root UserControl元素指定名称,则可以使用ElementName:

引用它
<UserControl x:Class="muc"
             Name="rootElement">
    <Label Foreground="#FF7800" FontSize="20" FontWeight="Bold">
        <Label.Content>
            <Binding ElementName="rootElement" Path="TestName" />
        </Label.Content>
    </Label>
</UserControl>

您还可以使用标记扩展语法使其缩短:

<UserControl x:Class="muc"
             Name="rootElement">
    <Label Foreground="#FF7800" FontSize="20" FontWeight="Bold"
           Content="{Binding TestName, ElementName=rootElement}"/>
</UserControl>

另请记住,您的控件将在设置其属性之前创建。您将需要实现INotifyPropertyChanged或将TestName作为依赖项属性,以便在设置属性后重新评估绑定。

答案 2 :(得分:3)

我只使用Silverlight做过这个,但如果它以完全相同的方式工作,我不会感到惊讶!

// <summary>
// Xaml exposed TextExposedInXaml property.
// </summary>
public static readonly DependencyProperty TestNameProperty = DependencyProperty.Register("TestName", typeof(string), typeof(NameOfMyUserControl), new PropertyMetadata(string.empty));

// <summary>
 // Gets or sets the control's text
// </summary>
public string TextExposedInXaml
{
            get
            {
                return (string)GetValue(TestNameProperty );
            }

            set
            {
                SetValue(TestNameProperty , value);

                // set the value of the control's text here...!
            }
}

答案 3 :(得分:0)

{Binding ElementName=x}绑定到元素树中名称为x元素,此处没有任何内容可以处理属性TestName。如果您想在用户控件上使用属性,则必须在与该用户控件对应的类中定义该属性(在您的情况下,它将是muc),并使用{Binding RelativeSource={RelativeSource FindAncestor, ...}}来引用它您的用户控件(有关详细信息,请参阅here)或为其命名,以便您可以使用ElementName