在最小值和最大值之后绑定 DoubleUpDown 值

Bind DoubleUpDown Value after Minimum and Maximum

我有一个 UserControl,一个 ListBox 和一个 DoubleUpDown。当我 select ListBox 中的项目时,我想设置 MinimumMaximumDoubleUpDownValue,以便用户可以不是从预定义范围内更改 Value,而是在给定值附近的某个范围内更改。我使用此代码:

<extToolkit:DoubleUpDown Increment="0.1" Value="{Binding SelectedItem.MyValue, ElementName=listBox1, UpdateSourceTrigger=PropertyChanged, Converter={conv:CheckValue}}" FormatString="0.0">
    <extToolkit:DoubleUpDown.Maximum>
        <MultiBinding Converter="{conv:CorMaximum}">
            <Binding Path="SelectedItem.MyValue" ElementName="listBox1" />
            <Binding Path="SelectedItem.MaxDif" ElementName="listBox1" />
        </MultiBinding>
    </extToolkit:DoubleUpDown.Maximum>
    <extToolkit:DoubleUpDown.Minimum>
        <MultiBinding Converter="{conv:CorMinimum}">
            <Binding Path="SelectedItem.MyValue" ElementName="listBox1" />
            <Binding Path="SelectedItem.MaxDif" ElementName="listBox1" />
        </MultiBinding>
    </extToolkit:DoubleUpDown.Minimum>
</extToolkit:DoubleUpDown>  

问题是这段代码首先设置 Value 然后设置 MinimumMaximum 所以如果我有这个值:

Name | MyValue | MaxDif
-----------------------
 One |    6    |   2
 Two |    1    |   1

One 的范围是 4..8,Two 的范围是 0..2。如果我先 select One 然后 Two 它看起来像 Two.MyVal = 4,因为值是在范围内插入的来自 One 仍然有效。

如何更改代码以先设置 MinimumMaximum 然后再设置 Value?

Official Design Recommendations 状态

Allow properties to be set in any order even if this results in a temporary invalid state of the object

这基本上意味着在设计您自己的控件时,请确保在初始化完成之前省略健全性检查(直到 IsInitializedtrue 并且触发 Initialized 事件)。

显然,DoubleUpDown 的设计并未考虑到您的确切问题,而是在初始化完成之前强制执行 Min/Max 边界。

编辑:this particular control 的 public 源代码似乎考虑了 IsInitialized 所以你遇到的问题实际上不应该发生。

虽然在我能找到的任何文档中都没有明确说明,但 Xaml 解析器会按照遇到的顺序设置对象属性。


可能的解决方案:

您应该可以通过最后设置 Value 属性 来解决这个问题。