ListBox アイテムの複雑なテンプレートを作成しようとしていますが、一部のバインディングが機能しないか、「双方向バインディングにはパスまたは XPath が必要です」。例外が発生しました。
CustomerViewModel の ObservableCollection に ListBox バインディングがあります。ListBox の各項目は、CustomerViewModel オブジェクトの 2 つのプロパティを表示する必要があります。1 つ目は「名前」(タイプ - 文字列)、2 つ目は「値」(タイプ - オブジェクト) です。「値」の実数型は、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 を書かずにこのようにすることはできますか?