Как я могу получить доступ к значениям DependencyProperty из моего конструктора с выделенным кодом? - PullRequest
5 голосов
/ 25 мая 2009

У меня есть UserControl с именем SmartForm , который имеет свойство DependencyProperty с именем Status .

В моем Window1.xaml есть элемент <local:SmartForm Status="Ready"/>.

Тогда я бы подумал, что в конструкторе объекта SmartForm этот статус будет равен «Готов», но вместо этого он равен null .

Почему тогда значение свойства Status NULL в конструкторе SmartForm?

Если нет в конструкторе UserControl, когда у меня будет доступ к значению , тогда?

Window1.xaml:

<Window x:Class="TestPropertyDefine23282.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:TestPropertyDefine23282"
    Title="Window1" Height="300" Width="300">
    <Grid>
        <local:SmartForm Status="Ready"/>
    </Grid>
</Window>

SmartForm.xaml:

<UserControl x:Class="TestPropertyDefine23282.SmartForm"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Height="300" Width="300">
    <Grid>
        <TextBlock x:Name="TestingMessage"/>
    </Grid>
</UserControl>

SmartForm.xaml.cs:

using System.Windows;
using System.Windows.Controls;

namespace TestPropertyDefine23282
{
    public partial class SmartForm : UserControl
    {
        public SmartForm()
        {
            InitializeComponent();

            TestingMessage.Text = Status; //WHY IS STATUS NOT YET SET HERE?

        }

        #region DependencyProperty: Status
        public string Status
        {
            get
            {
                return (string)GetValue(StatusProperty);
            }
            set
            {
                SetValue(StatusProperty, value);
            }
        }

        public static readonly DependencyProperty StatusProperty =
            DependencyProperty.Register("Status", typeof(string), typeof(SmartForm),
            new FrameworkPropertyMetadata());
        #endregion

    }
}

Ответы [ 4 ]

3 голосов
/ 25 мая 2009
<local:SmartForm Status="Ready"/>

Переводится как:

SmartForm f = new SmartForm();
f.Status = Status.Ready;

Вы получите доступ к этому значению при вызове сеттера.

3 голосов
/ 25 мая 2009

Вы можете установить это тестовое сообщение как:

...
    public static readonly DependencyProperty StatusProperty = 
        DependencyProperty.Register("Status", typeof(string), typeof(SmartForm),
        new FrameworkPropertyMetadata("", FrameworkPropertyMetadataOptions.None,
            new PropertyChangedCallback(OnStatusChanged)));

    public static void OnStatusChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) {
        ((SmartForm)d).TestingMessage.Text = e.NewValue.ToString();
    }
...

или как:

<UserControl 
x:Class="TestPropertyDefine23282.SmartForm"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:TestPropertyDefine23282"
Height="300" Width="300"
>
<Grid>
    <TextBlock
        x:Name="TestingMessage"
        Text="{Binding Path=Status, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type local:SmartForm}}}"
        />
</Grid>
</UserControl>
1 голос
/ 16 декабря 2016

Шимон Розга отлично объяснил проблему. Вы проверяете параметр до его установки, но после инициализации конструктора.

Хорошим решением является использование загруженного события вместо этого:

(непроверенная)

    public SmartForm()
    {
        InitializeComponent();

        Loaded += (sender, args) =>
        {
            TestingMessage.Text = Status; 
        };
    }
0 голосов
/ 26 мая 2009

Это своего рода высшее образование, но зачем вам вообще нужен этот сеттер?

<UserControl x:Class="TestPropertyDefine23282.SmartForm"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Name="Control"
    Height="300" Width="300">
    <Grid>
        <TextBlock Text="{Binding Path=Status, ElementName=Control}" />
    </Grid>
</UserControl>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...