WPF: Не може да се обвърже със свойство на зависимост на потребителски контроли

Създадох персонализиран контрол със свойство на зависимост за обвързване на данни. След това обвързаната стойност трябва да се покаже в текстово поле. Това обвързване работи правилно.

Проблемът възниква, когато внедря персонализираната си контрола. Контекстът на данните на мрежата е прост модел на изглед, който съдържа свойство String за обвързване.

  1. Ако обвържа това свойство със стандартно текстово поле за контроли на wpf, всичко работи добре.
  2. Ако обвържа свойството с моя персонализиран контрол, нищо не се случва.

След известно отстраняване на грешки установих, че SampleText се търси в CustomControl. Разбира се, че не съществува там. Защо моето свойство се търси в CustomControl, а не се взема от DataContext, както се случва в сценарий 1.

    <Window x:Class="SampleApplicatoin.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:controls="clr-namespace:SampleApplication"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Grid.DataContext>
            <controls:ViewModel/>
        </Grid.DataContext>
        <TextBox Text="{Binding SampleText}"/>
        <controls:CustomControl TextBoxText="{Binding SampleText}"/>
    </Grid>
</Window>

Под XAML кода на персонализираната контрола. Използвам DataContext = Self, за да получа свойството на зависимост от кода зад:

<UserControl x:Class="SampleApplication.CustomControl"
             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" 
             d:DesignHeight="300" d:DesignWidth="300" DataContext="{Binding RelativeSource={RelativeSource Self}}">
    <Grid>
        <TextBox HorizontalAlignment="Left" Height="23" Margin="87,133,0,0" TextWrapping="Wrap" Text="{Binding TextBoxText}" VerticalAlignment="Top" Width="120"/>
    </Grid>
</UserControl>

Файлът xaml.cs съдържа само свойството на зависимост:

public partial class CustomControl : UserControl
    {
        public static readonly DependencyProperty TextBoxTextProperty = DependencyProperty.Register("TextBoxText", typeof (String), typeof (CustomControl), new PropertyMetadata(default(String)));

        public CustomControl()
        {
            InitializeComponent();
        }

        public String TextBoxText
        {
            get { return (String) GetValue(TextBoxTextProperty); }
            set { SetValue(TextBoxTextProperty, value); }
        }
    }

Благодаря за всяка помощ по въпроса. Вече наистина ме подлудява.

РЕДАКТИРАНЕ:

Току-що стигнах до две възможни решения:

Ето първото (което работи за мен):

<!-- Give that child a name ... -->
<controls:ViewModel x:Name="viewModel"/>
<!-- ... and set it as ElementName -->
<controls:CustomControl TextBoxText="{Binding SampleText, ElementName=viewModel}"/>

Второто. Това не работи в моя случай. не знам защо:

<controls:CustomControl TextBoxText="{Binding SampleText, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type controls:ViewModel}}}"/>
<!-- or -->
<controls:CustomControl TextBoxText="{Binding SampleText, RelativeSource={RelativeSource FindAncestor, AncestorType=controls:ViewModel}}"/>

person onestarblack    schedule 27.09.2013    source източник


Отговори (1)


Имах подобна ситуация. В моя случай го поправих с добавяне на OnPropertyChanged в настройка на свойство във ViewModel.

person zetty    schedule 09.12.2013