我想将我的TextBox.Text
绑定到两个不同的来源。
我有 2 个ViewModel
,一个是一般ViewModel
,一个更具体(继承自其父级)。
两个ViewModel
都有一个名为"热键"的属性。
我想绑定我的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
获取值,但它不会将其值设置为特定的值(继承自父级)
问题可能出在您用于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
并保持文本框的文本不变(尽管您之前尝试过删除/修改它)。因此,我们需要一些标志justConvertedBack
来防止这种情况发生。
当前从常规视图模型更改源将更改文本框的文本,但不会更新特定视图模型的源。但是,如果为文本框的文本设置/键入某些值,则会从特定视图模型更新源,但不会将该值从常规视图模型反射回源。我希望这种行为是你想要的。