【问题标题】:WPF MulitBinding of Slider and TextBox not updating property滑块和文本框的 WPF MulitBinding 未更新属性
【发布时间】:2019-09-28 16:32:56
【问题描述】:

我正在尝试使用 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 的内容,并认为我的转换器可能会出错,但对它应该是什么一无所知。

【问题讨论】:

  • 你好像没有转换器。 MultiBinding 在那里做什么?你想用ExportQuality 属性做什么?
  • 我认为您误解了 MultiBindings 的目的是什么以及它们是如何工作的。我建议您不要在此处尝试 MultiBinding,而是让您的 Textbox.Text 属性仅与 ExportQuality 绑定。你让 Slider.Value 也绑定到 ExportQuality。 (本质上,Slider 和 TextBox 都是 UI 元素,它们表示并允许更改 ExportQuality,因此让两者都绑定 ExportQuality 是很自然的)
  • 我不明白你为什么需要多重绑定
  • 多重绑定旨在将来自多个来源(绑定)的值提供给属性。如果您不通过多转换器提供翻译逻辑,则需要使用诸如 stringformat 之类的标记扩展来告诉它如何处理这些值。也许这就是您的意图,或者您完全误解了多重绑定。 c-sharpcorner.com/UploadFile/91c28d/…

标签: wpf multibinding


【解决方案1】:

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

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

我希望能解决你所问的问题。

【讨论】:

    【解决方案2】:

    当您使用该绑定时,它会尝试在Slider.Value 属性上设置"75"(注意它是string)和ExportQuality 的值(虽然不知道它的类型),即double,它有红色边框,因为类型错误(即 TextBox 试图为 Binding 使用不正确的类型,如果您将 TextBox 绑定到 int 属性并输入“a”,也会发生这种情况),如果您使用转换器是这种情况,当它会ConvertBack();

    在这种情况下将使用 FYI MultiValueConverter。

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

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

    这样,如果第一个绑定失败,第二个将启动。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-03
      • 1970-01-01
      • 2013-03-28
      相关资源
      最近更新 更多