更改数据模板中的绑定对象
changing the bound object in a datatemplate
数据模板很棒,但我在特定情况下遇到绑定问题。我有一个 class,值,它有各种后代,如 StringValue
、DateValue
等。这些值显示在 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。
数据模板很棒,但我在特定情况下遇到绑定问题。我有一个 class,值,它有各种后代,如 StringValue
、DateValue
等。这些值显示在 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。