代码之家  ›  专栏  ›  技术社区  ›  aviv

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

  •  7
  • aviv  · 技术社区  · 14 年前

    我的用户控件:

     <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 回复  |  直到 14 年前
        1
  •  3
  •   AlvinfromDiaspar    14 年前

    我只在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...!
                }
    }
    
        2
  •  8
  •   Justin Pihony    12 年前

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

    要使属性像其他本地属性一样工作,请执行以下完整过程: (示例添加了一个类型为null的依赖项属性,该属性可以在控件中显示为文本,如果为null,则显示为默认值)

    1. 1.定义依赖属性:

      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";
          }
      }
      

      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”):

     < TextBlock Name="MyNumberTextBlock" Text="{Binding MyNumber, ElementName=RootElement}"/>
    
        3
  •  5
  •   Quartermeister    14 年前

    如果给根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>
    

    TestName 必须是依赖项属性,以便在设置属性后重新计算绑定。

        4
  •  0
  •   Pavel Minaev    14 年前

    {Binding ElementName=x} 绑定到 要素 有名字的 x TestName . 如果要在用户控件上定义属性,则必须在与该用户控件对应的类中定义该属性(在您的情况下是 muc ),并使用 {Binding RelativeSource={RelativeSource FindAncestor, ...}} here 详细信息),或给它一个名称,以便您可以使用 ElementName .