【问题标题】:WPF: How to bind together two properties bound to two different controlsWPF:如何将绑定到两个不同控件的两个属性绑定在一起
【发布时间】:2014-02-28 01:50:32
【问题描述】:

假设我有 2 个属性 CantTouchThis.FirstCantTouchThis.Second 其中 CantTouchThis 意味着我无法挂钩到他们的 INotifyPropertyChanged 实现。

我可以将它们绑定到两个滑块:

<Slider Value="{Binding CantTouchThis.First, Mode=TwoWay}" />
<Slider Value="{Binding CantTouchThis.Second, Mode=TwoWay}" />
<!-- textblocks just to display the values -->
<TextBlock Text="{Binding CantTouchThis.First, StringFormat={}{0:0.00}}" />
<TextBlock Text="{Binding CantTouchThis.Second, StringFormat={}{0:0.00}}" />

如何创建一个复选框(如果选中)将两个滑块和CantTouchThis.FirstCantTouchThis.Second 绑定在一起?

<CheckBox IsChecked="True" Content="Bind both together." Name="bindUsCheckbox" />

帮助永远感激,

标记

编辑

我开始尝试使用IMultiValueConverter 来完成此操作,但在尝试使其以复选框为条件时卡住了:

public class DuplicateValuesConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        return values[0];
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {

        object[] output = new object[2];
        output[0] = value;
        output[1] = value;         

        return output;
    }
}

还有这样的绑定:

        <Slider.Value>
            <MultiBinding Converter="{StaticResource magicConverter}" Mode="TwoWay">
                <Binding Path="First" />
                <Binding Path="Second" />
            </MultiBinding>
        </Slider.Value>

【问题讨论】:

  • 您希望多重绑定如何工作?您想要汇总(添加)这些值吗?
  • 不只是重复,即 First == Second == Slider1.Value == Slider2.Value 解决方案不必是IMultiValueConverter,但在这种情况下可以使用一个?
  • You need a DataTrigger for this - 当 CheckBox 上 IsChecked 属性的值发生变化时评估触发器。
  • 将绑定从常规绑定更改为多绑定的 DataTrigger?
  • 您采用的方法取决于您想要实现的目标的复杂性 - 您可能希望根据复选框值换出模板化区域/样式。

标签: wpf multibinding


【解决方案1】:

在 MultiBinding 中包含 checkbox.IsChecked 值。使用converterParameter识别它是哪个滑块,不同步时返回它的值。

<Slider.Value>
   <MultiBinding Converter="{StaticResource magicConverter}" Mode="TwoWay" ConverterParamter='0'>
        <Binding Path="First" />
        <Binding Path="Second" />
        <Binding ElementName="bindUsCheckbox" Path="IsChecked" />
   </MultiBinding>
</Slider.Value>

然后这样处理:

public class DuplicateValuesConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        if (bool.Parse(value[2].ToString()))
        { // keep sync
            return values[0];
        }
        else
        {
            return values[int.Parse(parameter.ToString())];
        }
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        object[] output = new object[2];
        output[0] = value;
        output[1] = value;         

        return output;
    }
}

【讨论】:

  • 不幸的是,这也不起作用,它只是将两个滑块绑定在一起。例如:您移动滑块 #1,更改其值,它会触发 ConvertBack 并将 FirstSecond 分配给它的值。之后,它使用条件语句执行Convert,但到那时它并不重要。仍然是一个非常巧妙的尝试。
  • 如果只将 ConvertBack 中的值设置为输出[参数] 会怎样?是否仅将滑块更改的值设置为 CantTouchThis.First 或 CantTouchThis.Second 属性,然后在 PropertyChangedEvent 触发转换并将值取决于 checkBox.IsChecked 设置为两者(如果同步)或仅设置为滑块改变了。
猜你喜欢
  • 2018-08-08
  • 1970-01-01
  • 2014-06-07
  • 1970-01-01
  • 2021-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多