更改datatemplate中的绑定对象

时间:2015-03-25 00:30:36

标签: c# wpf datatemplate

数据模板很棒,但我在特定情况下遇到绑定问题。我有一个类Value,它有各种后代,如StringValueDateValue等。这些值显示在Listbox中。此模板工作正常,绑定到StringValue的特定属性:

<DataTemplate DataType="{x:Type values:StringValue}">
    <TextBox Margin="0.5"
             Text="{Binding Path=Native}" />
</DataTemplate>

但是,当我绑定到对象本身而不是特定属性时,更改不会更新对象,如此模板中所示:

<DataTemplate DataType="{x:Type values:LookupValue}">
    <qp:IncrementalLookupBox SelectedValue="{Binding Path=., Mode=TwoWay}"
         LookupProvider="{Binding ElementName=EditWindow, Path=ViewModel.LookupProvider}">
    </qp:IncrementalLookupBox>
</DataTemplate>

IncrementalLookupBox是一个UserControl,最终允许用户选择LookupValue,它应该替换模板中绑定的项目。如果将其绑定到类似int或string的简单类型,则绑定将替换该对象,因此我不确定与更复杂的对象的区别。我知道IncrementalLookBox正在运行,因为将一些文本框绑定到SelectedValue的属性(这是一个依赖属性)会显示正确选择的LookupValue

如果情况更清楚,这里是SelectedValue的实现:

    public LookupValue SelectedValue
    {
        get { return (LookupValue)GetValue(SelectedValueProperty); }
        set { SetValue(SelectedValueProperty, value); }
    }

    // Using a DependencyProperty as the backing store for SelectedValue.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty SelectedValueProperty =
        DependencyProperty.Register("SelectedValue", typeof(LookupValue), typeof(IncrementalLookupBox), new PropertyMetadata(OnSelectedValuePropertyChanged));

    private static void OnSelectedValuePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var obj = d as IncrementalLookupBox;
        obj.OnSelectedValuePropertyChanged(e);
    }

    private void OnSelectedValuePropertyChanged(DependencyPropertyChangedEventArgs e)
    {
        CheckForSelectedValueInLookups();
    }

3 个答案:

答案 0 :(得分:0)

如果所有其他方法都失败,请考虑使用ValueConverter获取所需的值。

答案 1 :(得分:0)

编辑:这不起作用。请参阅以下评论中的链接。

确保您的类实现了INotifyPropertyChanged并在此处引发了PropertyChanaged:

 private void OnSelectedValuePropertyChanged(DependencyPropertyChangedEventArgs e)
 {
     CheckForSelectedValueInLookups();
     // RaisePropertyChanged();
 }

答案 2 :(得分:0)

我的问题与此处描述的相同:

WPF TwoWay Binding of ListBox using DataTemplate

显然,如果我在这里没有写足够的文字,我的答案将被转换为评论而不是关闭问题。所以,总结一下这个问题,双向Binding =。在ListBox(或任何ItemsControl I图像)中使用的datatemplate将无法工作,因为它不是绑定对象本身,而是包含它的ListBoxItem。