Slider 和 TextBox 的 WPF MulitBinding 未更新 属性

WPF MulitBinding of Slider and TextBox not updating property

我正在尝试使用 MultiBinding 将滑块绑定到文本框(有效)并将文本框绑定到 属性(无效)。 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 被修整为红色,这是告诉我有问题吗?

我阅读了一些关于 MultiBinding 的内容,认为我的 Converter 可能出了问题,但我不知道它应该是什么。

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

例如,给定以下 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。

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

当你使用那个 Binding 时,它会尝试设置 "75"(注意它是 string)和 ExportQuality 的值(尽管不知道它的类型) Slider.Value 属性,即 double,它有红色边框,因为类型错误(即 TextBox 试图使用不正确的类型进行绑定,如果您将 TextBox 绑定到一个 int 属性 然后你输入 "a"),如果你使用一个转换器,那么它会 ConvertBack();

FYI MultiValueConverter would be used in this case.

我想你想在这里使用的是 PriorityBinding。可以这样使用:

<TextBox>
    <TextBox.Text>
        <PriorityBinding>
            <Binding ElementName="SliderExportQuality" Path="Value"/>
            <Binding Path="ExportQuality" UpdateSourceTrigger="PropertyChanged"/>
        </PriorityBinding>
    </TextBox.Text>
</TextBox>

这样,如果第一个绑定失败,第二个绑定将生效。