更改数据模板中的绑定对象

changing the bound object in a datatemplate

数据模板很棒,但我在特定情况下遇到绑定问题。我有一个 class,值,它有各种后代,如 StringValueDateValue 等。这些值显示在 Listbox 中。该模板工作正常,绑定到特定的 属性 of 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,最终允许用户 select 一个 LookupValue,它应该替换模板中绑定的项目。如果 this 绑定到一个简单的类型,如 int 或 string,绑定将替换对象,所以我不确定与更复杂的对象有什么区别。我知道 IncrementalLookBox 正在工作,因为将一些文本框绑定到 SelectedValue 的属性(这是一个依赖项 属性)显示正确的 selected 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();
    }

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

编辑:这不起作用。请参阅下面评论中的 link。

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

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

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

WPF TwoWay Binding of ListBox using DataTemplate

显然,如果我在这里写的文字不够多,我的回答将被转换为评论,而不会关闭问题。所以,总结一下这个问题,双向绑定=。在 ListBox(或任何 ItemsControl I 图像)中使用的数据模板中将不起作用,因为它不是对象本身被绑定,而是包含它的 ListBoxItem。