我回答了this问题,并且在执行此操作时发现了很多奇怪的行为。由于我是亲MVVM,我把一个解决方案放在一起,看看我是否会看到相同的行为。我的解决方案揭示的是,尽管我绑定了TwoWay
到Slider.Value
,但在Slider.Maximum
和Slider.Minimum
更改后,它并未在我的ViewModel中更新;即我的视图模型的Value
可以在UpperLimit
和LowerLimit
之外,同时Slider.Value
(我的VM的Value
属性被绑定到)在范围之内。更改后滑块值不会更新最小值和最大值
在上述的问题,改变Slider.Maximum
或Slider.Minimum
似乎始终保持在范围Slider.Value
,有时“恢复” Slider.Value
将它用于设置为以前的值。
Microsoft's Slider Source Code
- 为什么确实
Slider.Value
变化/作为链接的问题看到即使当前值的最小/最大范围内恢复它的价值呢? - 为什么没有我的视图模型的
Value
财产,势必Slider.Value
与之匹配的TwoWay
改变UpperLimit
和LowerLimit
后绑定?- 注意,绑定最大&最低做工作
MainWindow.xaml:
<DockPanel>
<Slider Name="MySlider" DockPanel.Dock="Top" AutoToolTipPlacement="BottomRight" Value="{Binding Value, Mode=TwoWay}" Maximum="{Binding UpperLimit}" Minimum="{Binding LowerLimit}"/>
<Button Name="MyButton1" Click="MyButton1_Click" DockPanel.Dock="Top" Content="shrink borders"/>
<Button Name="MyButton2" Click="MyButton2_Click" DockPanel.Dock="Top" VerticalAlignment="Top" Content="grow borders"/>
<Button Name="MyButton3" Click="MyButton3_Click" DockPanel.Dock="Top" VerticalAlignment="Top" Content="Print ItemVM Value"/>
</DockPanel>
MainWindow.xaml。CS:
public partial class MainWindow : Window
{
private readonly ItemViewModel item;
public MainWindow()
{
InitializeComponent();
DataContext = item = new ItemViewModel(new Item(1, 20, 0.5));
}
private void MyButton1_Click(object sender, RoutedEventArgs e)
{
//MySlider.Minimum = 1.6;
//MySlider.Maximum = 8;
item.LowerLimit = 1.6;
item.UpperLimit = 8;
}
private void MyButton2_Click(object sender, RoutedEventArgs e)
{
//MySlider.Minimum = 0.5;
//MySlider.Maximum = 20;
item.LowerLimit = 0.5;
item.UpperLimit = 20;
}
private void MyButton3_Click(object sender, RoutedEventArgs e)
{
System.Diagnostics.Debug.WriteLine("Item Value: " + item.Value);
System.Diagnostics.Debug.WriteLine("Slider Value: " + MySlider.Value);
}
}
项目/ ItemViewModel:
public class ItemViewModel : INotifyPropertyChanged
{
private readonly Item _item;
public event PropertyChangedEventHandler PropertyChanged;
public ItemViewModel(Item item)
{
_item = item;
}
public double UpperLimit
{
get
{
return _item.UpperLimit;
}
set
{
_item.UpperLimit = value;
NotifyPropertyChanged();
}
}
public double LowerLimit
{
get
{
return _item.LowerLimit;
}
set
{
_item.LowerLimit = value;
NotifyPropertyChanged();
}
}
public double Value
{
get
{
return _item.Value;
}
set
{
_item.Value = value;
NotifyPropertyChanged();
}
}
private void NotifyPropertyChanged([CallerMemberName] string propertyName = "")
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
public class Item
{
private double _value;
private double _upperLimit;
private double _lowerLimit;
public double Value
{
get
{
return _value;
}
set
{
_value = value;
}
}
public double UpperLimit
{
get
{
return _upperLimit;
}
set
{
_upperLimit = value;
}
}
public double LowerLimit
{
get
{
return _lowerLimit;
}
set
{
_lowerLimit = value;
}
}
public Item(double value, double upperLimit, double lowerLimit)
{
_value = value;
_upperLimit = upperLimit;
_lowerLimit = lowerLimit;
}
}
重现步骤:
点击
MyButton3
项目值= 1
滑块值= 1
移动滑块/拇指全部向右
点击
MyButton3
项目的方式值= 20
滑块值= 20
按此
MyButton1
按此
MyButton3
项值= 20
滑块值= 8
如果你把MyButton3_Click
一个破发点,并执行最后一步,你可以看到,
我能够将它分解为大部分,但我无法确定故障的位置。它是否显而易见,如何改变代码隐藏和绑定中的值的行为有所不同;这不是我。我也质疑这个事实,如果强迫泡沫或隧道下来。当我试图找出SelectionStart/End是否在值和Max/Min之前被强制执行时,我的思维过程转向了意大利面条,当时我无法逐步浏览代码。我将不得不阅读胁迫。如果你对如何理解逻辑或发生的事情有了更多的了解,那么我就是耳朵。谢谢! – Kcvin
相应编辑。 :) –
@MarkFeldman我已经查看了WPF源代码,并将Minimum设置为明确调用最大值和最大值的强制回调。我是否理解你的帖子? –