1

Hallo и благодарю вас за ваше время.Сопоставление данных, частично работающее с пользовательской зависимостью в UserControl

У меня есть своеобразная проблема. Я создал usercontol, который имеет некоторые пользовательские свойства зависимостей.

Если я реализую usercontrol и привязываюсь к статическому тексту. Все работает нормально.

Однако, если я попытаюсь установить его для значения свойств выбранных объектов. Это не работает.

Это ошибка, я получаю в окне вывода:

Error: BindingExpression path error: 'SelectedUseCase' property not found on 'Helper.UserControls.UseCasePropertyDisplay'. BindingExpression: Path='SelectedUseCase.Name' DataItem='Helper.UserControls.UseCasePropertyDisplay'; target element is 'Helper.UserControls.UseCasePropertyDisplay' (Name='null'); target property is 'Text' (type 'String')

UserControl:
https://github.com/Toudahl/SoftwareDesignHelper/blob/master/Helper/UserControls/DisplayAndEditControl.xaml

<UserControl 
    x:Class="Helper.UserControls.UseCasePropertyDisplay" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="using:Helper.UserControls" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    mc:Ignorable="d" 
    d:DesignHeight="300" 
    d:DesignWidth="400" 
    DataContext="{Binding RelativeSource={RelativeSource Self}}"> 

    <StackPanel Orientation="Horizontal" 
       Margin="260,0,0,0"> 
     <TextBlock Text="{Binding Label}" 
        Style="{StaticResource UseCaseTextBlock}" 
        x:Name="textblock_label"/> 
     <TextBlock x:Name="textblock_propertyContent" 
        Text="{Binding Text}" 
        Style="{StaticResource UseCaseFrameWorkTextElement}" 
        DoubleTapped="textblock_DoubleTapped" /> 
     <TextBox x:Name="textbox_propertyContent" 
       Text="{Binding Text}" 
       Visibility="Collapsed" 
       Style="{StaticResource UseCaseTextBox}" 
       LostFocus="textbox_LostFocus" /> 
    </StackPanel> 
</UserControl> 

Decleration свойств зависимостей в коде:
https://github.com/Toudahl/SoftwareDesignHelper/blob/master/Helper/UserControls/DisplayAndEditControl.xaml.cs

public static readonly DependencyProperty TextProperty = DependencyProperty.Register(
      "Text", 
      typeof(string), 
      typeof(UseCasePropertyDisplay), 
      new PropertyMetadata(null)); 

    public static readonly DependencyProperty LabelProperty = DependencyProperty.Register(
     "Label", 
     typeof(string), 
     typeof(UseCasePropertyDisplay), 
     new PropertyMetadata(null)); 

    public string Text 
    { 
     get { return (string)GetValue(TextProperty); } 
     set {SetValue(TextProperty, value);} 
    } 

    public string Label 
    { 
     get { return (string)GetValue(LabelProperty); } 
     set { SetValue(LabelProperty, value);} 
    } 

Это, как я реализовать его в виде:
https://github.com/Toudahl/SoftwareDesignHelper/blob/master/Helper/ViewsAndViewModels/ViewUseCases.xaml

<uc:UseCasePropertyDisplay Label="Name" Text="{Binding SelectedUseCase.Name, Mode=TwoWay}" /> 

От чтения очень похожие вопросы здесь, им угадать, что у него есть что-то делать с тем, как я установить контекст. Однако решение, которое было предоставлено людям (установка относительного источника для предка), не работает для меня. Поскольку он недоступен на моей платформе. Я не совсем уверен, куда идти отсюда, так как это первый раз, когда я пытаюсь использовать usercontrols, и в первый раз я использую свойства зависимостей. Школа не начинается до нескольких недель, поэтому я не могу удержать своего учителя за это.

ответ

0

вместо установки DataContext глобального, установите первые элементы пользовательского интерфейса к унаследованной DataContext: DataContext="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}}"

Как вы написали, вы не можете использовать FindAncestor, так что вы можете попробовать использовать имя и ссылку на него:

<UserControl 
    x:Class="Helper.UserControls.UseCasePropertyDisplay" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="using:Helper.UserControls" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    mc:Ignorable="d" 
    d:DesignHeight="300" 
    d:DesignWidth="400" 
    x:Name="Root"> 

    <StackPanel DataContext="{Binding ElementName=Root}"         
       Orientation="Horizontal" 
       Margin="260,0,0,0"> 
     <TextBlock Text="{Binding Label}" 
        Style="{StaticResource UseCaseTextBlock}" 
        x:Name="textblock_label"/> 
     <TextBlock x:Name="textblock_propertyContent" 
        Text="{Binding Text}" 
        Style="{StaticResource UseCaseFrameWorkTextElement}" 
        DoubleTapped="textblock_DoubleTapped" /> 
     <TextBox x:Name="textbox_propertyContent" 
       Text="{Binding Text}" 
       Visibility="Collapsed" 
       Style="{StaticResource UseCaseTextBox}" 
       LostFocus="textbox_LostFocus" /> 
    </StackPanel> 
</UserControl> 
+0

Спасибо. Это сработало :) Не могли бы вы объяснить мне, почему? Мне кажется, это похоже на настройку источника родственников. И если у вас есть ссылка на документацию или учебник msdn/howto, я был бы признателен. Я не смог найти ничего, кроме документации для класса родственников. –

+0

, если вы настроите DataContext на себя, экземпляр вашего класса UserControl будет DataContext. У вас нет возможности обращаться к свойствам из внешнего ViewModel, который вы используете. Без установки DataContext в UserControl он будет использовать родительский, который вы хотите. См. Ответ от pdross [http://stackoverflow.com/questions/5077377/usercontrols-datacontext](http://stackoverflow.com/questions/5077377/usercontrols-datacontext) для получения дополнительной информации. – Juergen

Смежные вопросы