Проблемы с DependencyProperty относительно UserControl и WPF Dialog - PullRequest
0 голосов
/ 22 октября 2018

Я потратил столько кода, сколько мог, чтобы попытаться получить работающий кусок кода, но я все еще терплю неудачу.Некоторые советы приветствуются.

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

В MainWindow я устанавливаю TextValue на «привет» в xaml.TextValue хорошо отображается в xaml и компилируется, поэтому я почти уверен, что у меня настроен DependencyProperty.Когда диалоговое окно полностью открыто, я заглядываю в отладчик, и мое свойство TextValue по-прежнему равно нулю.

Я пропустил настройку контекста данных?Может быть, я не в курсе того, что я хочу сделать.

Спасибо, что нашли время, чтобы выяснить, что я делаю неправильно.

Мой пользовательский элемент управления: UserControl1 Xaml:

<UserControl x:Class="WpfApplication1.UserControl1"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             Loaded="UserControl_Loaded"
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <Grid>

    </Grid>
</UserControl>

UserControl1.xaml.cs:

namespace WpfApplication1
{
    /// <summary>
    /// Interaction logic for UserControl1.xaml
    /// </summary>
    public partial class UserControl1 : UserControl
    {
        public UserControl1()
        {
            InitializeComponent();
        }

        public static readonly DependencyProperty TextProperty = DependencyProperty.Register("TextValue", typeof(string), typeof(UserControl1));

        private string _tv;
        public string TextValue
        {
            get
            {
                return _tv;
            }
            set
            {
                _tv = value;
            }
        }

        private void UserControl_Loaded(object sender, RoutedEventArgs e)
        {

        }
    }
}

Мое окно вызова xaml:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:usercontrols="clr-namespace:WpfApplication1"
        Title="MainWindow" Height="350" Width="525"
        Loaded='Window_Loaded'>
    <Grid>
        <usercontrols:UserControl1 x:Name="usercontroltest1" TextValue="hi"/>
    </Grid>
</Window>

Мое окно вызова .cs:

    namespace WpfApplication1
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {

        }
    }
}

1 Ответ

0 голосов
/ 22 октября 2018

Получатель и установщик «свойства-оболочки» должны вызывать методы GetValue и SetValue базового класса DependencyObject, как показано ниже.Кроме того, существует соглашение об именовании, которое предписывает, чтобы поле идентификатора свойства зависимостей было названо как свойство плюс суффикс Property.См. Пользовательские свойства зависимостей для всех деталей.

public static readonly DependencyProperty TextValueProperty =
    DependencyProperty.Register(
        nameof(TextValue), typeof(string), typeof(UserControl1));

public string TextValue
{
    get { return (string)GetValue(TextValueProperty); }
    set { SetValue(TextValueProperty, value); }
}

Чтобы получить доступ к свойству зависимостей UserControl в его собственном XAML, вы обычно используете привязку RelativeSource, например:

<UserControl x:Class="WpfApplication1.UserControl1" ...>
    <Grid>
        <TextBlock Text="{Binding TextValue,
                          RelativeSource={RelativeSource AncstorType=UserControl}}" />
    </Grid>
</UserControl>
...