Установить 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. Я надеюсь, что это то, что вы хотите.

Другие вопросы по тегам