Установка и отображение свойства в пользовательском элементе управления WPF - PullRequest
2 голосов
/ 24 февраля 2010

Я что-то здесь упускаю? Я создал usercontrol со свойством, и для аргументов в нем есть текстовое поле.

<UserControl x:Class="Isd.Utility.SystemMonitorWpf.Bar"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

<TextBlock x:Name="txtExpected" Grid.Column="0" Grid.ColumnSpan="2" Width="auto" Height="auto" FontSize="10" LayoutTransform="{StaticResource Rotate}" HorizontalAlignment="Center" VerticalAlignment="Center" FontFamily="Tahoma" Foreground="Red" Panel.ZIndex="100" Margin="5,5,5,5"/>

Тогда в коде у меня есть

public partial class Bar : UserControl
{
    private string _PropTest;

    public string PropTest
    {
        get { return _PropTest; }
        set { _PropTest = value; }
    } 

public Bar()
    {
        InitializeComponent();
        txtExpected.Text = PropTest;
    }
}

Затем я помещаю usercontrol в xaml и устанавливаю для свойства значение

<local:Bar PropTest="test"></local:Bar>

В этом примере, когда отображается usercontrol, текст отображается как ноль, как свойство PropTest, которое никогда не устанавливалось. Я что-то упускаю здесь очевидное? Заранее спасибо.

Ответы [ 6 ]

0 голосов
/ 24 февраля 2010

Вы должны использовать DependencyProperties, чтобы вы могли связать свои свойства элемента управления через xaml

В вашем объявлении класса:

    public static readonly DependencyProperty MyProperty = DependencyProperty.Register(
        "MyProperty",                  //Property name
        typeof(string),                //Property type
        typeof(MyControl),             //Type of the dependency property provider
        new PropertyMetadata(MyPropertyChanged));//Callback invoked on property value has changes

    public string MyProperty
    {
        set
        {
            this.SetValue(MyProperty, value);
        }
        get
        {
            return (string)this.GetValue(MyProperty);
        }
    }

    private static void MyPropertyChanged( object sender, DependencyPropertyChangedEventArgs args )
    {
      // update your control inner elements properties
    }

Отредактировано несколько раз из-за опечаток: P

0 голосов
/ 24 февраля 2010

Это потому, что значение атрибута никогда не будет установлено для свойства Text элемента txtExpected-Control. В то время, когда вызывается конструктор, свойство PropTest по-прежнему равно нулю.

Итак, вам нужно изменить реализацию вашей собственности:

public string PropTest
{
    get { return txtExpected.Text; }
    set { txtExptected.Text = value; }
}
0 голосов
/ 24 февраля 2010

Вы, похоже, ничего не делаете в сеттере PropTest. Он не будет установлен до начала строительства, поэтому он будет нулевым, когда вы выполните:

txtExpected.Text = PropTest;

Внутри вашего конструктора. Если вы сделаете это:

public string PropTest
{
    get { return _PropTest; }
    set 
    { 
        _PropTest = value; 
        txtExpected.Text = PropTest;
    }
} 

Это должно работать. Это не то, что я бы назвал «идеальным» способом сделать что-то, хотя вы можете взглянуть на Свойства зависимости , INotifyPropertyChanged и Binding .

0 голосов
/ 24 февраля 2010

Назначение значения делегирования в свойстве PropTest для TextBox:

public string PropTest
{
    get { return txtExpected.Text; }
    set { txtExpected.Text = value; }
} 
0 голосов
/ 24 февраля 2010

Что происходит, когда вы добавляете атрибут Text следующим образом:

<TextBlock x:Name="txtExpected" Text="{Binding PropTest}" />

и исключить строку

txtExpected.Text = PropTest;

от конструктора?

0 голосов
/ 24 февраля 2010

При использовании в качестве такого атрибута, как у вас, PropTest устанавливается после вызова конструктора, поэтому он не устанавливается при применении свойства к текстовому полю.

Лучше присоединить событие к изменению свойства или использовать TextBox в качестве вспомогательного значения для свойства.

...