设置Multibing for text - get和set

时间:2014-11-15 13:51:54

标签: wpf mvvm multibinding

我想将TextBox.Text绑定到两个不同的来源。

我有2 ViewModel个,一个是通用的ViewModel,另一个是更具体的(从父母那里继承)。

两个ViewModel都有一个名为" Hotkey"。

的属性

我想绑定我的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 个答案:

答案 0 :(得分:0)

我相信问题可能出在您用于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反映回源。我希望这种行为是你想要的。