2011-03-19 74 views
1
  • combobox1.SelectedItem綁定到SelectedItemProperty
  • 的時候SelectedItemProperty設置,MaxValueProperty計算
  • MaxValueProperty勢必slider1.Maximum滑塊上的WPF綁定不會更新上最大更改

  • slider1.Value勢必SliderValueProperty

這些都做工精細,除了當combobox1.SelectedItem變化,MaxValueProperty是計算出來的,並且小於SliderValueProperty

在查看:

  • slider1.Maximum被更新,因爲MaxValueProperty改變,
  • slider1.Value設置爲slider1.Maximum爲滑塊的默認行爲時,最大的變化小於該值。

然而,當這種情況發生,SliderValueProperty沒有更新到新slider1.Value

<Slider Name="slider1" Maximum="{Binding Path=MaxValueProperty, Mode=TwoWay}" Value="{Binding Path=SliderValueProperty, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> 

我知道slider1.Value正在得到改變,因爲我已經綁定了一個標籤,標籤更改

<Label Content="{Binding ElementName=slider, Path=Value, Converter={StaticResource NumberToStringConverter}}" /> 

如何確保綁定更新?

回答

0

而不是依靠滑塊的默認行爲和TwoWay綁定,你計算你的SelectedItemProperty二傳手新的最大後,首先在「SliderValueProperty」養PropertyChanged事件中使用新的最大值,然後第二次上「MaxValueProperty」。在私人支持領域進行計算,而不是在公共領域。

這將導致系統首先調整滑塊的值,然後將MAXVALUE,它應該移動滑塊位置爲您服務。

將slider1的Maximum的綁定模式設置爲OneWay;我認爲這會做到這一點。

與這樣的視圖模型如下:

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> 
+0

你回答不久之前,我做了一個類似的if語句來你的,但財產,分配SliderValueProperty提高它的PropertyChanged事件,固定我的問題。但有一個問題 - 爲什麼在私人支持字段的計算,然後手動提升屬性更改事件? – xdumaine 2011-03-20 02:26:16

+0

鑑於你的問題的它似乎最明確和直接的方式做到這一點的時候MVVM在使用說明。你有一個財產製定者改變了其他財產的條件,雖然你可以按照你選擇的方式沒有問題地做到這一點,但我對你的計劃還沒有其他的瞭解。當我希望更改顯示在UI中時,我通常會選擇明確提出PropertyChanged。 – 2011-03-20 05:46:10

+0

是的,它只是'if(SliderValueProperty> MaxValueProperty){SliderValueProperty = MaxValueProperty; }'和'if(_SliderValueProperty> _MaxValueProperty){_ SliderValueProperty = _MaxValueProperty; RaisePropertyChanged(SliderValueProperty);}' – xdumaine 2011-03-20 15:27:15