在最小值和最大值之后绑定 DoubleUpDown 值
Bind DoubleUpDown Value after Minimum and Maximum
我有一个 UserControl
,一个 ListBox
和一个 DoubleUpDown
。当我 select ListBox
中的项目时,我想设置 Minimum
、Maximum
和 DoubleUpDown
的 Value
,以便用户可以不是从预定义范围内更改 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
然后设置 Minimum
和 Maximum
所以如果我有这个值:
Name | MyValue | MaxDif
-----------------------
One | 6 | 2
Two | 1 | 1
One 的范围是 4..8,Two 的范围是 0..2。如果我先 select One 然后 Two 它看起来像 Two.MyVal = 4
,因为值是在范围内插入的来自 One 仍然有效。
如何更改代码以先设置 Minimum
和 Maximum
然后再设置 Value
?
Official Design Recommendations 状态
Allow properties to be set in any order even if this results in a temporary invalid state of the object
这基本上意味着在设计您自己的控件时,请确保在初始化完成之前省略健全性检查(直到 IsInitialized
为 true
并且触发 Initialized
事件)。
显然,DoubleUpDown
的设计并未考虑到您的确切问题,而是在初始化完成之前强制执行 Min/Max 边界。
编辑:this particular control 的 public 源代码似乎考虑了 IsInitialized
所以你遇到的问题实际上不应该发生。
虽然在我能找到的任何文档中都没有明确说明,但 Xaml 解析器会按照遇到的顺序设置对象属性。
可能的解决方案:
您应该可以通过最后设置 Value
属性 来解决这个问题。
我有一个 UserControl
,一个 ListBox
和一个 DoubleUpDown
。当我 select ListBox
中的项目时,我想设置 Minimum
、Maximum
和 DoubleUpDown
的 Value
,以便用户可以不是从预定义范围内更改 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
然后设置 Minimum
和 Maximum
所以如果我有这个值:
Name | MyValue | MaxDif
-----------------------
One | 6 | 2
Two | 1 | 1
One 的范围是 4..8,Two 的范围是 0..2。如果我先 select One 然后 Two 它看起来像 Two.MyVal = 4
,因为值是在范围内插入的来自 One 仍然有效。
如何更改代码以先设置 Minimum
和 Maximum
然后再设置 Value
?
Official Design Recommendations 状态
Allow properties to be set in any order even if this results in a temporary invalid state of the object
这基本上意味着在设计您自己的控件时,请确保在初始化完成之前省略健全性检查(直到 IsInitialized
为 true
并且触发 Initialized
事件)。
显然,DoubleUpDown
的设计并未考虑到您的确切问题,而是在初始化完成之前强制执行 Min/Max 边界。
编辑:this particular control 的 public 源代码似乎考虑了 IsInitialized
所以你遇到的问题实际上不应该发生。
虽然在我能找到的任何文档中都没有明确说明,但 Xaml 解析器会按照遇到的顺序设置对象属性。
可能的解决方案:
您应该可以通过最后设置 Value
属性 来解决这个问题。