2014-11-15 4 views
0

Я хотел бы привязать свой TextBox.Text к двум различным источникам.Set Multibing for text - get and set

У меня есть 2 ViewModel s, один общий ViewModel и один более конкретный (который наследуется от его родителя).

Оба ViewModel s имеют свойство под названием «Горячая клавиша».

Я хотел бы связать свой TextBox.Text, чтобы он получил значение от общего ViewModel и задал его конкретным ViewModel.

Я попытался следующие:

<TextBlock HorizontalAlignment="Center" VerticalAlignment="Center" TextAlignment="Center" Foreground="#000"> 
    <TextBlock.Text> 
     <MultiBinding Converter="{StaticResource test}"> 
      <Binding Path="DataContext.Hotkey" RelativeSource="{RelativeSource AncestorType={x:Type MetroStyle:MetroWindow}}" Mode="OneWay" /> 
      <Binding Path="Hotkey" Mode="OneWayToSource"/> 
     </MultiBinding> 
    </TextBlock.Text> 
</TextBlock> 

Это действительно получает значение из общего ViewModel, но она не устанавливает его значение в удельном (который наследуется от родителей)

ответ

0

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

public class TestConverter : IMultiValueConverter 
{ 
    private bool justConvertedBack; 
    object IMultiValueConverter.Convert(object[] values, Type targetType, 
        object parameter, System.Globalization.CultureInfo culture) 
    { 
     if (justConvertedBack) { 
      justConvertedBack = false; 
      return Binding.DoNothing; 
     } 
     return values[0]; 
    } 

    object[] IMultiValueConverter.ConvertBack(object value, Type[] targetTypes, 
        object parameter, System.Globalization.CultureInfo culture) 
    { 
     justConvertedBack = true; 
     return new object[] {null, value}; 
    } 
} 

Бывает, что после завершения ConvertBack будет запущен Convert и сохранить текст вашего TextBox без изменений (хотя вы пытались удалить/изменить его раньше). Поэтому нам нужен флаг justConvertedBack, чтобы это не произошло.

В настоящее время изменения источника от общего ViewModel изменит текст в TextBox в но не обновляет источник от конкретного ViewModel. Однако, если установка/ввод некоторого значения для TextBox Text будет обновлять источник из определенного ViewModel, но не будет отражать это значение обратно в исходный код из общей модели ViewModel. Надеюсь, что поведение - это то, что вы хотите.