具有基于类型的DataTemplate的多级绑定
本文关键字:DataTemplate 多级 绑定 类型 于类型 | 更新日期: 2023-09-27 18:22:42
我试图为ListBox项制作一个复杂的模板,但有些绑定不起作用,或者出现了"双向绑定需要Path或XPath。"异常。
我在CustomerViewModel的ObservableCollection上有一个ListBox绑定。ListBox中的每个项都必须显示CustomerViewModel对象的两个属性。第一个是"Name"(类型字符串),第二个是"Value"(类型对象)。"Value"的实际类型可以是:bool、int、string、datetime,因此用于显示的控件模板必须是可选择的。
"Value"属性代码:
public object Value
{
get
{
switch (this.info.InputType)
{
case Enums.InputType.DateTime:
return Convert.ToDateTime(this.info.Value);
case Enums.InputType.Logical:
return Convert.ToBoolean(this.info.Value);
case Enums.InputType.Numeric:
return Convert.ToInt32(this.info.Value);
case Enums.InputType.Text:
return this.info.Value;
}
throw new ArgumentOutOfRangeException();
}
set
{
this.info.Value = value.ToString();
this.RaisePropertyChanged("Value");
}
}
XAML:
<ListBox ItemsSource="{Binding Customers}">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<Label Content="{Binding Name}"/>
<ContentControl Content="{Binding Value}">
<ContentControl.Resources>
<DataTemplate DataType="{x:Type system:String}">
<TextBox Text="{Binding}"/>
</DataTemplate>
<DataTemplate DataType="{x:Type system:Boolean}">
<CheckBox IsChecked="{Binding}"/>
</DataTemplate>
<DataTemplate DataType="{x:Type system:Int32}">
<TextBox Text="{Binding}"/>
</DataTemplate>
<DataTemplate DataType="{x:Type system:DateTime}">
<DatePickerTextBox Text="{Binding}"/>
</DataTemplate>
</ContentControl.Resources>
</ContentControl>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
由于,下面的XAML引发"双向绑定需要Path或XPath"异常
<ContentControl Content="{Binding Value}">
和
<TextBox Text="{Binding}"/>
如果我将最后一行更改为:
<TextBox Text="{Binding Path=.}"/>
没有例外,但绑定只能"单向"工作。我认为,不知何故,我需要将TextBox绑定到和ContentControl相同的属性"Value",但在这种情况下,我无法执行TwoWay绑定。
如果不写ItemTemplateSelector,可以这样做吗?
您是否尝试过设置模式的最后一行?
<TextBox Text="{Binding Path=., Mode=TwoWay}"/>
编辑:
我注意到你在用这个fieldInfo。get和this中的值信息。集合中的值,这只是拼写错误吗?
你确定你不能在你的盘中打出破发点吗?
编辑:
嗯,我没有什么想法了,也许你可以尝试设置更新源触发器?:
<TextBox Text="{Binding Path=., Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>