Как прочитать переданный параметр в WPF UserControl? - PullRequest
7 голосов
/ 03 февраля 2009

Я создал пользовательский элемент управления в WPF:

<UserControl x:Class="TestUserControl.Controls.GetLatest"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
        <TextBlock Name="theTextBlock"/>
</UserControl>

Код имеет параметр «FirstMessage», который он устанавливает как текст моего пользовательского элемента управления TextBlock:

public partial class GetLatest : UserControl
{
    public string FirstMessage { get; set; }

    public GetLatest()
    {
        InitializeComponent();
        theTextBlock.Text = this.FirstMessage;
    }
}

В моем основном коде я могу установить параметр FirstMessage в моем пользовательском элементе управления с помощью intellisense:

<Window x:Class="TestUserControl.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300"
    xmlns:controls="clr-namespace:TestUserControl.Controls"
    >
    <StackPanel>
        <controls:GetLatest FirstMessage="This is the title"/>
    </StackPanel>
</Window>

Однако текст по-прежнему не устанавливается. Я пробовал Text = "{Binding Path = FirstMessage}" и другие синтаксисы, которые я нашел, но ничего не работает.

Как получить доступ к значению FirstMessage в моем пользовательском элементе управления?

Ответы [ 5 ]

15 голосов
/ 03 февраля 2009

Ваш подход к привязке не работает, потому что ваше свойство FirstMessage не уведомляет, когда оно обновляется. Используйте свойства зависимости для этого. Смотрите ниже:

public partial class GetLatest : UserControl
{
    public static readonly DependencyProperty FirstMessageProperty = DependencyProperty.Register("FirstMessage", typeof(string), typeof(GetLatest));

    public string FirstMessage
    {
        get { return (string)GetValue(FirstMessageProperty); }
        set { SetValue(FirstMessageProperty, value); }
    }

    public GetLatest()
    {
        InitializeComponent();
        this.DataContext = this;
    }

}

XAML:

<UserControl x:Class="TestUserControl.Controls.GetLatest"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <TextBlock Text="{Binding FirstMessage}" />
</UserControl>

При изменении свойства FirstMessage ваш текстовый блок обновляется сам.

3 голосов
/ 03 февраля 2009

FirstMessage устанавливается после вызова конструктора. Вы должны изменить свой текст из установщика FirstMessage.

При инициализации объекта из XAML сначала вызывается конструктор по умолчанию, затем свойства устанавливаются для объекта.

2 голосов
/ 03 февраля 2009

В этом быстром примере не будет использоваться привязка, поскольку значение не устанавливается до тех пор, пока не будет вызван конструктор по умолчанию, но вот как вы можете заставить текст отображаться.

<UserControl x:Class="TestUserControl.Controls.GetLatest"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Loaded="GetLatest_Loaded">
        <TextBlock Name="theTextBlock"/>
</UserControl>

Затем просто измените ваш файл cs на это:

public partial class GetLatest : UserControl
{
    public string FirstMessage { get; set; }

    public GetLatest()
    {
        InitializeComponent();
        theTextBlock.Text = this.FirstMessage;
    }

    private void GetLatest_Loaded(object sender, RoutedEventArgs e)
    {
        theTextBlock.Text = this.FirstMessage;
    }
}

Я рекомендую вместо этого поработать над настройкой Binding, так как это довольно спагетти-подобный код.

1 голос
/ 04 февраля 2009

Вы также можете использовать:

public partial class GetLatest : UserControl
{
    private string _firstMessage;
    public string FirstMessage 
    {
        get { return _firstMessage; }
        set { _firstMessage = value; theTextBlock.Text = value; }
    }

    public GetLatest()
    {
        InitializeComponent();
    }
}
0 голосов
/ 03 февраля 2009

В случае кода, который вы разместили выше, это проблема синхронизации; свойству FirstMessage не было присвоено его значение при выполнении конструктора. Вы должны выполнить этот код в событии, происходящем позже, например, в Loaded.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...