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

Я возиться с WPF и создаю пользовательские элементы управления, но мне трудно понять, как должна работать привязка данных. Связывание данных кажется слишком сложным, и пока WPF уже вышел, я бы подумал, что MS создала бы несколько ярлыков, чтобы избежать необходимости делать так много стандартного кода.

Пользовательский контроль xaml

<UserControl x:Class="WPFTest.FancyBox"
             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" 
             mc:Ignorable="d">
   <DockPanel>
      <Label Content="{Binding MyText}"></Label>
   </DockPanel>
</UserControl>

Пользовательский контроль .cs

public partial class FancyBox : UserControl
{
    public static readonly DependencyProperty MyTextProperty = DependencyProperty.Register("MyText", typeof(string), typeof(FancyBox), new PropertyMetadata(null));

    public string MyText
    {
        get => (string)GetValue(MyTextProperty);
        set => SetValue(MyTextProperty, value);
    }

    public FancyBox()
    {
        InitializeComponent();
    }
}

Использование в моем главном окне

<StackPanel>
    <local:FancyBox MyText="testing!"/>
</StackPanel>

Ответы [ 2 ]

1 голос
/ 09 марта 2019

Привязка Content="{Binding MyText}" - это привязка к DataContext элемента управления (Label), который унаследован от ближайшего предка дерева, у которого он есть (ваш код не показывает никакого назначения DataContext)

Ваше поведение предназначено для того, чтобы Контент Label связывался с Собственностью пользовательского элемента управления, в этом случае вам нужно заставить пользователя контролировать ваш источник.Например, существует множество способов сделать это:

<UserControl x:Class="WPFTest.FancyBox"
x:Name="RootElement"
....
<Label Content="{Binding MyText, Source={x:Reference RootElement} />

Или другим способом:

<Label Content="{Binding MyText, RelativeSource={RelativeSource FindAncestor,
    AncestorType={x:Type local:FancyBox}}" />

Помните, что любые привязки без источника (Source, RelativeSource) будут исходить из DataContext.

0 голосов
/ 09 марта 2019

Полагаю, для этого мне вообще не нужно было связывать данные

Я изменил свою метку элемента управления на:

<Label x:Name="lblText"></Label>

, а свой код позади:

public string MyText
{
     get => lblText.Content.ToString();
     set => lblText.Content = value;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...