Я пытаюсь создать сложный шаблон для элемента ListBox, но некоторые привязки не работают или «Двусторонняя привязка требует Path или XPath». исключение.Множественные привязки уровней с DataTemplate на основе типа
У меня есть привязка ListBox к ObservableCollection CustomerViewModel. Каждый элемент в ListBox должен отображать два свойства объекта CustomerViewModel. Первый - «Имя» (тип - строка), а второй - «Значение» (тип - объект). Реальный тип «Значение» может быть: 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 ниже бросает "Двусторонний связывание требует Path или XPath" исключение, из-за
<ContentControl Content="{Binding Value}">
и
<TextBox Text="{Binding}"/>
Если изменить последнюю строку:
<TextBox Text="{Binding Path=.}"/>
..there нет исключений, но связывание работает только "OneWay". Мне кажется, мне нужно каким-то образом связать TextBox с тем же свойством - «Value» как ContentControl, но я не могу выполнить привязку TwoWay в этом случае.
Это можно сделать без написания ItemTemplateSelector?
Да! Это не помогло, привязка еще OneWay. –
Да, извините. Это была просто опечатка - исправлена. Точно - я не могу попасть в точку останова в настройке «Значение». Я внес небольшие изменения в тестовые привязки: .. <Содержимое ярлыка = "{Binding Name}" /> ** ** .. ContentControl> .. Если я начну печатать на «testTextBox», тогда удары точки останова и строка в контроле контроля (внутри ContentControl) также изменились! Но не в обратном направлении. –