数据模板很棒,但我在特定情况下遇到绑定问题。我有一个类Value,它有各种后代,如StringValue
,DateValue
等。这些值显示在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();
}
答案 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。