2013-07-17 3 views
0

Я пытаюсь создать сложный шаблон для элемента 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?

ответ

0

Вы пробовали свою последнюю линию с настройкой режима?

<TextBox Text="{Binding Path=., Mode=TwoWay}"/> 

EDIT:

Я заметил, что вы используете это. fieldInfo. Ценность в получении и этом. info. ЦЕНА в комплекте, это только опечатка?

Вы уверены, что не можете ударить точку останова, установленную в вашем наборе?

EDIT:

Хм, я бегу из идей, может быть, вы могли бы попробовать установить обновление источника триггера ?:

<TextBox Text="{Binding Path=., Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/> 
+0

Да! Это не помогло, привязка еще OneWay. –

+0

Да, извините. Это была просто опечатка - исправлена. Точно - я не могу попасть в точку останова в настройке «Значение». Я внес небольшие изменения в тестовые привязки: .. <Содержимое ярлыка = "{Binding Name}" /> ** ** .. .. Если я начну печатать на «testTextBox», тогда удары точки останова и строка в контроле контроля (внутри ContentControl) также изменились! Но не в обратном направлении. –

Смежные вопросы