Может ли объект XAML быть источником для одной привязки, а также целью для другой привязки? - PullRequest
0 голосов
/ 07 января 2011

Возможно ли иметь TextBlock в качестве цели и источника?

В основном у меня есть группа сущностей, которые имеют простые отношения с другими сущностями (например, Entity1 Knows Entity3, Entity3 WorksAt Entity2 и т. Д.)

У меня есть класс Link, в котором хранятся детали SourceEntity, Relationship и TargetEntity.

Что я хочу сделать, это выбрать сущность, а затем отобразить отношениясвязанных с этим объектом, с целевыми объектами каждого отношения, перечисленными под именами отношения.

Когда объект выбран, ObservableCollection заполняется Links для этого конкретного объекта (SelectedEntityLinks<Link>).

Поскольку каждый объект может иметь одинаковые отношения с более чемодна целевая сущность (например, Entity1 может знать и Entity3, и Entity4). Я создал метод GetThisRelationshipEntities(), который принимает имя отношения в качестве параметра, просматривает SelectedEntityLinks для имен отношений, которые соответствуют параметру, и возвращаетObservableCollection с целевыми объектами этого отношения.

В моем xaml у меня есть WrapPanel для отображения каждого имени отношения в текстовом блоке:

<TextBlock x:Name="relationship" Text="{Binding Path=Relationship.Name}" />

Затем под этим другим текстовым блоком, которыйдолжен отображать результаты GetThisRelationshipEntities(String relationshipName).

Так что я хочу, чтобы TextBlock "взаимосвязи" получал свой текст из привязки, показанной выше, но также предоставлял свой текст в качестве параметра для GetThisRelationshipEntities()метод, который я добавил к <UserControl.Resources> как ObjectDataProvider.

Извините, если это немного многословно, но я надеюсь, что это понятно.Любые указатели / советы будут великолепны.

Ответы [ 3 ]

0 голосов
/ 07 января 2011

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

<TextBlock x:Name="relationship" Text="{Binding Path=Relationship.Name}"
             Mode=TwoWay />

, хотя теперь, когда я думаю об этом, это можетбыть опцией по умолчанию, поэтому вы также можете попытаться вызвать функцию GetThisRelationshipEntities () для TextBlock при каждом обновлении его источника:

private void relationship_SourceUpdated(object sender, DataTransferEventArgs e)
{
    //To DO: whatever update you wanna make
}
0 голосов
/ 07 января 2011

Ваша формулировка является несколько неточной: не DependencyObjects являются источником или целью привязки, а свойства DependencyObjects.Простое свойство может быть только источником в привязке, но DependencyProperty может действовать как источник и как цель.Например, в

<TextBox Text="{Binding Path=Name}" Name="txtName" />
<Label Content="{Binding ElementName=txtName, Path=Text}" />

свойство Text TextBox является целью привязки к некоторому свойству Name в DataContext, и в то же время является источникомпривязка к Content свойству Label.Параметр вызова метода не является свойством, поэтому он не может быть исходным или целевым в привязке.В вашем случае простейшим решением, вероятно, является обработка события TextBlock.TextChanged и вызов вашего метода оттуда.Использование ValueConverter в соответствии с предложением Мартина также является опцией.

Edit: Вот рабочий пример, демонстрирующий подход с использованием события TextChanged.Он записывает содержимое TextBox в Console каждый раз, когда вы что-то меняете.Для привязки к результату вашего метода вы можете просто позволить обработчику событий записать свой результат в свойство, а затем привязать к этому свойству.

MainWindow.xaml:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <StackPanel Orientation="Vertical">
        <TextBox Name="textBox1" TextChanged="textBox1_TextChanged" />
    </StackPanel>
</Window>

MainWindow.xaml.cs: ​​

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

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

    private void textBox1_TextChanged(object sender, TextChangedEventArgs e)
    {
        Console.WriteLine(this.textBox1.Text);
    }
  }
}
0 голосов
/ 07 января 2011

Мне кажется, что вы должны создать класс преобразователя значений, используя IValueConverter и свойство, которое является вашей таблицей отношений. При выполнении

<TextBlock x:Name="relationship" Text="{Binding Path=Relationship.Name}" />

вы бы добавили

<TextBlock x:Name="relationship" Text="{Binding Path=Relationship.Name, Converter={StaticResource myRelationConverter}}" />

в методе Convert() вы можете делать любые безумные вещи, которые захотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...