WPF绑定:属性包含值的路径

时间:2009-06-10 08:57:58

标签: c# wpf binding

我在顶部栏中有一个带有几个TextBlocks的扩展器,我用它来提供标题和一些关键信息。

理想情况下,我想设置关键信息的路径,但我无法弄清楚如何将绑定路径绑定到另一条路径(如果我没有多大意义,我道歉!)

在下面的xaml第一位工作,第二位是我正在努力的。

<TextBlock Text="{Binding Path=Header.Title}"/>

<TextBlock Text="{Binding Path={Binding Path=Header.KeyValuePath}}"/>

KeyValuePath可能包含类似“Vehicle.Registration”或“Supplier.Name”的内容,具体取决于模型。

有人能指出我正确的方向吗?任何帮助都感激不尽!

2 个答案:

答案 0 :(得分:3)

我不认为它可以在纯XAML中完成... Path不是DependencyProperty(并且无论如何Binding不是DependencyObject),所以它不能成为绑定的目标

您可以修改代码隐藏中的绑定

答案 1 :(得分:1)

我还没有找到在XAML中执行此操作的方法,但我在后面的代码中执行了此操作。这是我采取的方法。

首先,我想对ItemsControl中的所有项目执行此操作。所以我有这样的XAML:

<ListBox x:Name="_events" ItemsSource="{Binding Path=Events}">
    <ListBox.ItemTemplate>
        <DataTemplate DataType="{x:Type Events:EventViewModel}">
            <TextBlock Name="ActualText" />
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

然后,在构造背后的构造中,我订阅了ItemContainerGenerator

InitializeComponent();
_events.ItemContainerGenerator.StatusChanged
     += OnItemContainerGeneratorStatusChanged;

此方法如下:

private void OnItemContainerGeneratorStatusChanged(object sender, EventArgs e)
{
  if (_events.ItemContainerGenerator.Status!=GeneratorStatus.ContainersGenerated)
    return;

  for (int i = 0; i < _viewModel.Events.Count; i++)
  {
    // Get the container that wraps the item from ItemsSource
    var item = (ListBoxItem)_events.ItemContainerGenerator.ContainerFromIndex(i);
    // May be null if filtered
    if (item == null)
      continue;
    // Find the target
    var textBlock = item.FindByName("ActualText");
    // Find the data item to which the data template was applied
    var eventViewModel = (EventViewModel)textBlock.DataContext;
    // This is the path I want to bind to
    var path = eventViewModel.BindingPath;
    // Create a binding
    var binding = new Binding(path) { Source = eventViewModel };
    textBlock.SetBinding(TextBlock.TextProperty, binding);
  }
}

如果你只有一个项目来设置绑定,那么代码会更简单。

<TextBlock x:Name="_text" Name="ActualText" />

在代码背后:

var binding = new Binding(path) { Source = bindingSourceObject };
_text.SetBinding(TextBlock.TextProperty, binding);

希望能有所帮助。