gpt4 book ai didi

slider 上的 WPF 绑定(bind)不会在最大更改时更新

转载 作者:行者123 更新时间:2023-12-03 10:50:27 24 4
gpt4 key购买 nike

  • combobox1.SelectedItem绑定(bind)到 SelectedItemProperty .
  • SelectedItemProperty已设置,MaxValueProperty计算
  • MaxValueProperty绑定(bind)到 slider1.Maximum
  • slider1.Value绑定(bind)到 SliderValueProperty

  • 这些都可以正常工作,除非 combobox1.SelectedItem更改和 MaxValueProperty计算得出小于 SliderValueProperty .

    在 View 中:
  • slider1.Maximum已更新,因为 MaxValueProperty已更改,
  • slider1.Value设置为 slider1.Maximum当最大值更改为小于该值时,作为 slider 的默认行为。

  • 然而,当这种情况发生时, SliderValueProperty没有更新到新的 slider1.Value
    <Slider Name="slider1" Maximum="{Binding Path=MaxValueProperty, Mode=TwoWay}" Value="{Binding Path=SliderValueProperty, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />

    我知道 slider1.Value 正在发生变化,因为我绑定(bind)了一个标签,并且标签发生了变化
    <Label Content="{Binding ElementName=slider, Path=Value, Converter={StaticResource NumberToStringConverter}}" />

    如何确保绑定(bind)已更新?

    最佳答案

    而不是依赖 slider 的默认行为和 TwoWay绑定(bind),提高 PropertyChanged计算 SelectedItemProperty 中的新最大值后的事件setter,首先在“SliderValueProperty”上使用新的最大值,然后在“MaxValueProperty”上。在您的私有(private)支持字段上进行计算,而不是在公共(public)属性上。

    这将导致系统首先调整 slider 的值,然后调整最大值,它应该为您移动 slider 的位置。

    在slider1的Maximum上设置绑定(bind)模式至OneWay , 以及;我认为这会奏效。

    如下使用这样的 View 模型:

    Class viewmodel
    Implements INotifyPropertyChanged
    Private _selectedItemProperty As ComboBoxItem
    Public Property SelectedItemProperty As ComboBoxItem

    Get
    Return _selectedItemProperty
    End Get
    Set(value As ComboBoxItem)
    MaxValueProperty = value.Content
    If _sliderValueProperty > _maxValueProperty Then _sliderValueProperty = _maxValueProperty
    RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs("MaxValueProperty"))
    RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs("SliderValueProperty"))
    End Set
    End Property
    Private _maxValueProperty, _sliderValueProperty as Single
    Public Property MaxValueProperty As Single ' with setter that will raise PropertyChanged and use the backing field

    '...

    Public Property SliderValueProperty As Single ' with a setter that will raise PropertyChanged and use the backing field

    '...

    End Class

    XAML 看起来有点像这样:
        <Grid>
    <ComboBox Height="23" HorizontalAlignment="Left" Margin="40,38,0,0" Name="ComboBox1" VerticalAlignment="Top" Width="120" SelectedItem="{Binding SelectedItemProperty}">
    <ComboBoxItem Content="50" />
    <ComboBoxItem Content="30" />
    <ComboBoxItem Content="10" />
    </ComboBox>
    <Slider Name="slider1" Height="23" HorizontalAlignment="Left" Margin="87,135,0,0" VerticalAlignment="Top" Width="100" Value="{Binding SliderValueProperty}" Minimum="1" Maximum="{Binding MaxValueProperty}" />
    <Label Content="{Binding ElementName=slider1, Path=Value}" Margin="40,174,293,96" />

    </Grid>

    关于 slider 上的 WPF 绑定(bind)不会在最大更改时更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5359809/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com