【问题标题】:Slider Doesn't Update to Maximum Value滑块不更新到最大值
【发布时间】:2017-09-06 10:35:59
【问题描述】:

我有一个绑定到滑块的文本框。

<TextBox Text="{Binding ElementName=maxValue, Path=Value, UpdateSourceTrigger=LostFocus}" TextAlignment="Center" VerticalContentAlignment="Center" Width="30" Height="25" BorderBrush="Transparent" PreviewKeyDown="TextBox_PreviewKeyDown"></TextBox>
<Slider Value="{Binding TotalSize}" Maximum="{Binding MaxMaxBackupSize, Mode=TwoWay}" Minimum="{Binding MinBackupSize}" TickPlacement="BottomRight" TickFrequency="2" IsSnapToTickEnabled="True" Name="maxValue"></Slider>

在用户选择某些内容后,我重新计算最大值 (MaxMaxBackupSize),因为它是一个绑定的属性,这应该会更新文本框和滑块,但是,由于某种原因 - 只有文本框值被更改,如果它更高然后最大值,降低到最大值。然而,滑块似乎没有被触动,我仍然可以随意移动它(这也改变了文本框中的文本......

我有以下相关属性:

private int totalSize;

public int TotalSize
{
    get { return totalSize; }
    set
    {
        if (value == totalSize)
            return;

        totalSize = value;
        ConfigChanged = true;
        ChangeIni = true;
    }
}

public static int MaxMaxBackupSize { get; set; }
public static int MinBackupSize { get; set; }

用户按下控制杆后所做的改变是:

...
MaxMaxBackupSize = Convert.ToInt16(f / 1000000000)
TotalSize = (TotalSize < MaxMaxBackupSize) ? TotalSize : MaxMaxBackupSize;
...

UPDATE0:(顺便说一句,我正在使用一个名为 Fody.OnPropertyChanged 的​​ nuget 包,这让我无需提高 onpropertychanged - 所以这不是原因)

更新:当我的意思是滑块没有改变时,我应该清楚我在说什么 - 滑块确实移动了,但滑块的最大值仍然是旧的最大值。假设在最大值之前是 50,现在是 20,如果滑块之前是 30,那么它将切换到 20,但我仍然可以将它移动到 50。我希望最大值被限制在 20 . 不确定这是否可能。

UPDATE2:现在我找到了一种解决方法,检查该值是否大于属性中的最大值,如果是,它会弹出一个消息框,说明这是不可能的,然后返回。

【问题讨论】:

  • 当您在 SO 上提问时,请提供一个最小的 repo:stackoverflow.com/help/mcve
  • 缺少什么?也许只是我在用户选择某些东西后所做的更改......我会添加它。
  • @Sameed 阅读这篇文章 - 我正在使用一个特殊的包来为我实现它们,并且它工作得很好。这不是问题。
  • @Sameed 也许我的问题不清楚 - 请以粗体查看更新
  • 您确定 PropertyChanged 是由 Fody 在静态属性上触发的吗?当 MaxMaxBackupSize 属性不是静态的(某种解决方法)时,您能否尝试它是否有效

标签: c# wpf binding slider


【解决方案1】:

问题似乎是静态属性,因为 NotifyPropertyChanged 只能在实例上调用,因此要使其工作,您必须将其实现为静态成员,并使用非静态访问器,如

private static int _maxBackupSize;
public int MaxBackupSize
{ 
  get { return _maxBackupSize; }
  set { _maxBackupSize = value; <However your Framework raises the Event> }
}

现在您可以拥有一个带有非静态访问器的静态变量,该访问器可以引发 NotifyPropertyChanged 事件

【讨论】:

    猜你喜欢
    • 2015-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多