Свойство зависимости в библиотеке пользовательского элемента управления всегда равно нулю - PullRequest
0 голосов
/ 08 октября 2019

Итак, я получил этот элемент управления:

CharacterMapControl.xaml:

<UserControl x:Class="CharacterMap.CharacterMapControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:CharacterMap">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="350"/>
        </Grid.RowDefinitions>
        <StackPanel Grid.Row="0" Orientation="Horizontal">
            <TextBlock Text=""></TextBlock>
        </StackPanel>
    </Grid>


</UserControl>

Затем CharacterMapControl.xaml.cs:

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

namespace CharacterMap
{
    /// <summary>
    /// Interaction logic for CharacterMapControl.xaml
    /// </summary>
    ///     
    public partial class CharacterMapControl : UserControl 
    {
        public static readonly DependencyProperty FilepathProperty = DependencyProperty.Register("Filepath", typeof(string), typeof(CharacterMapControl));
        public string Filepath
        {
            get { return (string)GetValue(FilepathProperty); }
            set { SetValue(FilepathProperty, value); }
        }



        public CharacterMapControl()
        {
            InitializeComponent();
        }
    }
}

Это внутри WPFПользовательская библиотека управления для .NET Core.

Затем я добавил новый WPF App .NET Core Project и отредактировал файл MainWindow.xaml, чтобы он выглядел так:

<Window x:Class="WPF_Control_Tester.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:charactermap="clr-namespace:CharacterMap;assembly=CharacterMap"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <charactermap:CharacterMapControl Filepath="D:\\repos\\WpfProjects\\latinchars.xml"></charactermap:CharacterMapControl>
    </Grid>
</Window>

Хорошо - теперь Filepathвнутри CharacterMapControl.xaml.cs всегда null. Я не понимаю почему. Он правильно связан и должен отображаться в Filepath, который я добавил в MainWindow или?

Ответы [ 2 ]

1 голос
/ 08 октября 2019

Вы не привязали свойство Text вашего TextBlock ни к чему.

Когда я попробовал ваш код, я добавил привязку:

        <TextBlock Text="{Binding Filepath, RelativeSource={RelativeSource AncestorType=UserControl}}"/>

Что работает

1 голос
/ 08 октября 2019

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

Немного спустя после создания элемента управления CharacterMapControl будет загружено событие, и на этом этапе свойства зависимостей будут иметь инициализированные значения.

Модификация конструктора, как показано ниже, поможет понять больше.

        public CharacterMapControl()
        {
            InitializeComponent();

            var y = GetValue(FilepathProperty);
            Console.WriteLine(y);

            this.Loaded += (sender, args) =>
            {
                var x = GetValue(FilepathProperty);
                Console.WriteLine(x);
            };
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...