【发布时间】:2015-05-28 12:31:40
【问题描述】:
数据模板很棒,但在特定情况下我遇到了绑定问题。我有一个类 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();
}
【问题讨论】:
-
hmmm.... 是否需要 SelectedValue 绑定的完整路径?
-
听起来您的
LookupValue的属性通知未正确触发。当SelectedItem在IncrementalLookupBox上发生变化时,它需要为 LookupValue 触发 OnPropertyChanged。 -
最好使用
SelectedItem属性而不是SelectedValue属性,因为SelectedItem属性与对象一起使用,而SelectedValue属性通常用于属性来自对象的值...它应该与SelectedValuePath属性结合使用。有关详细信息,请参阅 MSDN 上的 How to: Use SelectedValue, SelectedValuePath, and SelectedItem 页面。 -
请参阅"Should questions include “tags” in their titles?",其中的共识是“不,他们不应该”!
-
@Sam:我正在尝试绑定到整个对象,而不是特定的属性。
标签: c# wpf datatemplate