Установить Multibing для текста - получить и установить
Я хотел бы связать мой TextBox.Text
в двух разных источниках.
у меня есть 2 ViewModel
с, один общий 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
, но это не устанавливает его значение к определенному (которое наследует от родителя)
1 ответ
Я полагаю, что проблема может быть в конвертере, который вы использовали для 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's Text, обновится источник из определенной ViewModel, но не будет отражено это значение обратно в источник из общей ViewModel. Я надеюсь, что это то, что вы хотите.