WPF滑块和文本框的MulitBinding不更新属性

时间:2019-05-10 18:34:57

标签: wpf multibinding

我正在尝试使用MultiBinding将滑块绑定到文本框(有效),并将TextBox绑定到属性(无效)。 TextBox / Property绑定可以与单绑定很好地配合,但是当我引入MultiBinding时,它会中断。

这是我的XAML

<Slider 
    Name="SliderExportQuality"
    Value="100"
    Minimum="0"
    Maximum="100"
    HorizontalAlignment="Left" 
    Margin="10,5,0,0" 
    VerticalAlignment="Top" 
    Width="239"/>
<TextBox>
    <TextBox.Text>
        <MultiBinding StringFormat="N2">
            <Binding ElementName="SliderExportQuality" Path="Value"/>
            <Binding Path="ExportQuality" UpdateSourceTrigger="PropertyChanged"/>
        </MultiBinding>
    </TextBox.Text>
</TextBox>

这是对话框。尝试直接在文本框中输入值后,TextBox会用红色修饰,这说明有问题吗?

enter image description here

我阅读了MultiBinding的一些内容,并认为我可能对Converter不太了解,但是对应该是什么却一无所知。

2 个答案:

答案 0 :(得分:2)

就像其他人在评论中提到的那样,除非我对这个问题有误解,否则您不需要多重绑定即可完成您想做的事情。要使滑块值显示在文本框中(反之亦然),您只需要将该值绑定到视图模型中的公共属性即可。

例如,给定以下xaml:

    <Grid Margin="20" VerticalAlignment="Center">
      <Grid.ColumnDefinitions>
         <ColumnDefinition Width="*"/>
         <ColumnDefinition Width="100"/>
      </Grid.ColumnDefinitions>

      <Slider Grid.Column="0" Minimum="0" Maximum="100" Value="{Binding FileSize}"/>
      <TextBox Grid.Column="1" Text="{Binding FileSize}"/>
   </Grid>

您有一个滑块,可将其值绑定到视图模型中的FileSize属性。

关联的ViewModel:

   class MainWindowViewModel : INotifyPropertyChanged
   {
      public int FileSize
      {
         get
         {
            return mFileSize;
         }
         set
         {
            if(mFileSize != value)
            {
               mFileSize = value;
               OnPropertyChanged(nameof(FileSize));
            }
         }
      } private int mFileSize = 50;

      private void OnPropertyChanged(String propertyName) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
      public event PropertyChangedEventHandler PropertyChanged;
   }

这允许通过滑块或直接在文本框中键入来更改值。仍然需要在文本框上进行错误检查,因为用户可以输入任何内容...但这显示了基本概念。

这将产生以下UI。

enter image description here

我希望能解决您提出的问题。

答案 1 :(得分:0)

使用该绑定时,它将尝试在{上设置"75"(注意它是string)和ExportQuality的值(尽管不知道其类型) {1}}属性,即Slider.Value,由于类型错误而具有红色边框(即TextBox试图对Binding使用错误的类型,如果将TextBox绑定到int属性并键入,也会发生这种情况在“ a”中),那么您应该使用转换器double

  在这种情况下,将使用

FYI MultiValueConverter。

我想您想在这里使用ConvertBack();。可以这样使用:

PriorityBinding

这样,如果第一个绑定失败,第二个绑定就会开始。