我正在尝试为 ListBox 项制作一个复杂的模板,但某些绑定不起作用或“双向绑定需要 Path 或 XPath”。发生异常。
我在 CustomerViewModel 的 ObservableCollection 上有一个 ListBox 绑定。ListBox 中的每一项都必须显示 CustomerViewModel 对象的两个属性。第一个是“名称”(类型 - 字符串),第二个是“值”(类型 - 对象)。“Value”的真实类型可以是:bool、int、string、datetime,所以显示的控件模板必须是可选的。
“价值”属性的代码:
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 抛出“双向绑定需要路径或 XPath”异常,因为
<ContentControl Content="{Binding Value}">
和
<TextBox Text="{Binding}"/>
如果我将最后一行更改为:
<TextBox Text="{Binding Path=.}"/>
..没有例外,但绑定仅适用于“OneWay”。我认为,我需要以某种方式将 TextBox 绑定到与 ContentControl 相同的属性 - “Value”,但在这种情况下我无法执行 TwoWay 绑定。
如果不写 ItemTemplateSelector 可以这样做吗?