2010-06-04 2 views
2

Я создаю редактор пары «ключ/значение» и хотел бы, чтобы значение имело собственный шаблон на основе типа данных.Двусторонняя привязка к ContentControl

<TextBox x:Uid="txtKey" x:Name="txtKey" Grid.Column="1" Grid.Row="0" Text="{Binding ElementName=This, Path=KeyValuePair.Key}" VerticalAlignment="Top"/> 
<ContentControl Grid.Column="1" Grid.Row="1" 
      x:Uid="ContentControl1" x:Name="ContentControl1" 
      Content="{Binding ElementName=This, Path=KeyValuePair.Value}" 
      LostFocus="ContentControl1_LostFocus" 
      DataContextChanged="ContentControl1_DataContextChanged" /> 

отделенный код для класса хоста выглядит следующим образом:

public partial class KeyValueControl : ControlBase 
{ 
    private System.Collections.DictionaryEntry _dictionaryEntry; 
    private KeyValuePairObjectObject _KeyValuePair = new KeyValuePairObjectObject(); 
    private DataTemplate _editorDataTemplate; 
    private Caelum.Libraries.Ui.Editors.Resources resources = new Editors.Resources(); 

    public DataTemplate EditorDataTemplate 
    { 
     get { return _editorDataTemplate; } 
     set { _editorDataTemplate = value; SendPropertyChanged("EditorDataTemplate"); } 
    } 

    public KeyValuePairObjectObject KeyValuePair 
    { 
     get { return _KeyValuePair; } 
     set { _KeyValuePair = value; SendPropertyChanged("KeyValuePair"); } 
    } 


    public KeyValueControl() 
    { 
     InitializeComponent(); 
     this.DataUpdated += new DataUpdatedHander(KeyValueControl_DataUpdated); 
     DataContextChanged += new DependencyPropertyChangedEventHandler(KeyValueControl_DataContextChanged); 
    } 

    void KeyValueControl_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e) 
    { 
    } 

    public override void Save() 
    { 
     base.Save(); 
    } 

    void KeyValueControl_DataUpdated(object sender, object data) 
    { 
     if (Data != null) 
     { 
      _dictionaryEntry = (System.Collections.DictionaryEntry)Data; 
      KeyValuePair.Key = _dictionaryEntry.Key; 
      KeyValuePair.Value = _dictionaryEntry.Value; 

      if (KeyValuePair.Value != null) 
      { 
       EditorDataTemplate = resources.GetDataTemplate(_dictionaryEntry.Value.GetType()); 
       ContentControl1.ContentTemplate = EditorDataTemplate; 
      }    
     } 
    } 


} 

DataTemplates выбирается с помощью класса ресурсов:

public DataTemplate GetDataTemplate(Type type) 
    { 

     if (type == typeof(string)) 
     { 
      return TextInlineEditorTemplate; 
     } 
     if (type == typeof(bool)) 
     { 
      return BooleanInlineEditorTemplate; 
     } 

     return null; 
    } 

DataTemplate, который отображается строка:

<DataTemplate x:Uid="TextInlineEditorTemplate" x:Key="TextInlineEditorTemplate" > 
    <Grid> 
     <TextBox x:Uid="txtTextIET1" x:Name="txtTextIET1" Width="300" Text="{Binding Path=DataContext, Mode=TwoWay, RelativeSource={RelativeSource Self}, BindsDirectlyToSource=True, UpdateSourceTrigger=PropertyChanged}" /> 
    </Grid> 
</DataTemplate> 

Данные связывают OK с ключевым TextBox (txtKey) и DataTemplate TextBox (txtTextIET1), но изменение значения в txtTextIET1 не приведет к запуску установщика в свойстве KeyValuePair. Я не смог найти примеров этого сценария, поэтому любая помощь будет оценена по достоинству.

ответ

0

ли не эту работу за вас

<DataTemplate x:Uid="TextInlineEditorTemplate" x:Key="TextInlineEditorTemplate" > 
    <Grid> 
     <TextBox x:Uid="txtTextIET1" x:Name="txtTextIET1" Width="300" Text="{Binding}" /> 
    </Grid> 
</DataTemplate> 
+0

С, что связывание получит ошибку, которая гласит: «Двустороннее связывание требует Path или XPath.» Вы можете обойти эту конкретную проблему, изменив привязку с {Binding} на {Binding.}, Но она по-прежнему не позволяет привязке TwoWay работать через ContentControl. – jpierson

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

  • Нет связанных вопросов^_^