2009-06-10 11 views
4

私はタイトルとキー情報を与えるために使用しているトップバーに2つのTextBlockを持つエクスパンダを持っています。WPFバインディング:プロパティに値へのパスが含まれています

理想的には私は情報の重要な部分へのパスを設定したいのですが、私は別のパスへの結合のパスをバインドする方法を考え出すことはできません(私はあまり意味を作っていないよ場合、私は謝罪!)

次のxamlでは最初のビットが機能し、2番目のビットは私が苦労しているものです。

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

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

KeyValuePathは、モデルに応じて、 "Vehicle.Registration" または "Supplier.Name" のようなものが含まれている場合があります。

誰でも正しい方向に私を指摘できますか?どんな援助も感謝して受け取りました!

+0

私は同じことをしようとしています。私は、カスタムマークアップの拡張が役に立つかもしれないのだろうかと思っていますが、Pathは依存関係のプロパティではないので、これがどのように機能するかはわかりません。 –

答えて

3

私はそれは純粋なXAMLで行うことができるとは思わない...パスがDependencyPropertyにではありません(と、とにかくバインディングのDependencyObjectではない)ので、それはあなたバインディング

の対象になりません代わりにコードビハインド内のバインディングを変更する可能性があります

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); 

誰かに役立ちます願っています。

関連する問題