Установка значения свойства XAML к пользовательскому элементу управления

У меня есть пользовательский элемент управления в 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" />

Но это не делает работ... Как я могу считать свойства?

7
задан aviv 5 July 2010 в 23:12
поделиться

4 ответа

Я делал это только в 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
ответ дан 6 December 2019 в 14:00
поделиться

{Binding ElementName = x} привязывается к элементу с именем x в дереве элементов, здесь нет ничего, что касается свойство TestName . Если вам нужно свойство в вашем пользовательском элементе управления, вы должны определить свойство в классе, соответствующем этому пользовательскому элементу управления (в вашем случае это будет muc ), и использовать {Binding RelativeSource = {RelativeSource FindAncestor, ...}} , чтобы ссылаться на него в вашем пользовательском элементе управления (подробности см. здесь ), или присвойте ему имя, чтобы вы могли использовать ElementName .

0
ответ дан 6 December 2019 в 14:00
поделиться

Если вы дадите корневому элементу 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 быть свойством зависимости, чтобы привязка повторно оценивалась после установки свойства.

4
ответ дан 6 December 2019 в 14:00
поделиться

Я попробовал первые два ответа, и то, что у меня получилось, работало в коде, но не в XAML (также не позволяет видеть изменения в представлении дизайна при использовании элемента управления).

Чтобы заставить свойство работать как любое другое нативное, вот полный процесс: (В образце добавляется свойство зависимости типа Nullable для отображения в элементе управления в виде текста или значения по умолчанию, если оно равно null)

  1. В файле кода:

    1.a Определите свойство зависимости:

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

    1.b Реализуйте обратный вызов OnMyNumberChanged:

     private static void OnMyNumberChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args){
     // При изменении цвета устанавливаем цвет значка PlayButton
    MyUserControl muc = (MyUserControl)obj;
    Значение Nullable = (Nullable)args.NewValue;
    если (значение != ноль)
     {
    muc.MyNumberTextBlock.Text = значение.ToString();
     }
    еще
     {
    muc.MyNumberTextBlock.Text = "Н/Д";
     }
    }
     

    1.c реализовать свойство MyNumber (не зависимость), чтобы использовать свойство зависимости для простоты использования в коде:

     public Nullable MyNumber{
    получить
     {
    return (Nullable)GetValue(MyNumberProperty);
     }
    набор
     {
    SetValue(MyNumberProperty, значение);
    OnTargetPowerChanged(это, новый DependencyPropertyChangedEventArgs(TargetPowerProperty, значение, значение)); // Старое значение не имеет значения.
     }
    }
     
  2. В файле XAML привяжите текст элемента управления TextBlock к свойству (не зависимости), чтобы получить значение свойства зависимости по умолчанию, если оно не задано пользователем элемента управления (при условии, что вы вызвали корневой элемент пользовательского control "RootElement"):

Этот код:

 < TextBlock Name="MyNumberTextBlock" Text="{Binding MyNumber, ElementName=RootElement}"/>
8
ответ дан 6 December 2019 в 14:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: