在我正在进行故障排除的旧版组件中,我偶然发现了以下内容:
<CustomControls:DiscreteSlider x:Name="slider" Grid.Column="1">
<CustomControls:DiscreteSlider.Value>
<MultiBinding Mode="TwoWay">
<MultiBinding.Converter>
<WinConverters:FeatureConverter />
</MultiBinding.Converter>
<Binding Path="Enabled" />
<Binding Path="Value" />
<Binding RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type local:DialogBase}}" />
</MultiBinding>
这是类似滑块的用户控件(“DiscreteSlider”)的绑定,后面的代码中包含以下代码(控件实际上包含了一个滑块并对其执行操作):
public static readonly DependencyProperty ValueProperty =
DependencyProperty.Register(
"Value",
typeof(double),
typeof(DiscreteSlider),
new FrameworkPropertyMetadata((double)0.0,
FrameworkPropertyMetadataOptions.AffectsRender,
new PropertyChangedCallback(OnValueChanged)));
public double Value
{
get { return (double)GetValue(ValueProperty); }
set { SetValue(ValueProperty, value); }
}
private static void OnValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
DiscreteSlider obj = d as DiscreteSlider;
if (obj != null)
{
double oldValue = (double)e.OldValue;
double newValue = (double)e.NewValue;
obj._Slider.Value = newValue;
obj.DoValueChanged(oldValue, newValue);
}
}
和
private void Thumb_DragCompleted(object sender, DragCompletedEventArgs e)
{
_IsUserChange = true;
Value = _Slider.Value;
}
发生的事情是价值实际上没有更新。 _Slider.Value
已正确设置,但在为其分配值后,值未更改。
这段代码唯一改变的是我们从.NET 3.5到4.0。我能够通过从XAML中的多绑定中删除Mode="TwoWay"
来“修复”此问题。但是,我不能巧合地编程。我想知道为什么会这样。
是否有人知道为什么这个XAML和代码在3.5而不是4中有效?如果你能想到其他一些可能的解释,我很乐意听到它,但是由于它在3.5中部署(和功能),因此XAML和该控件背后的代码都没有改变。
修改:
以下是有问题的值转换器的代码:
public class FeatureConverter : IMultiValueConverter
{
private bool Enabled = true;
private const int MinValue = MelodyConst.MinValue;
public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (values == null || values.Count() < 2) return null;
double returnValue = MelodyConst.DisabledValue;
bool featureEnabled;
Int32 featureValue;
bool.TryParse(values[0].ToString(), out featureEnabled);
Int32.TryParse(values[1].ToString(), out featureValue);
Enabled = featureEnabled;
if (!featureEnabled)
return returnValue;
else
returnValue = (double)(featureValue);
return returnValue;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
{
Int32 newSliderValue;
Int32.TryParse(value.ToString(), out newSliderValue);
object[] lsValues = new object[2];
lsValues[0] = (object)Enabled;
lsValues[1] = newSliderValue;
return lsValues;
}
}
答案 0 :(得分:3)
我没有亲身经历过你遇到过的问题。但根据ScottGu's blog,Xaml / Baml解析器已被WPF 4.0中的新解析器替换。所以完全有可能在3.5和4.0之间有一些重大变化,但我没有找到任何具体的问题引用。
来自博客。
WPF 4取代了它的XamlReader.Load()实现,BAML加载,控制&amp; DataTemplates功能与在新System.Xaml.dll之上构建的新引擎。作为这项工作的一部分,我们修复了许多错误并进行了许多功能改进。
答案 1 :(得分:0)
我认为这可能会发生,因为您有三个值绑定到MultiValue转换器,但在ConvertBack方法中,您只返回两个值;你可以尝试删除第三个绑定,因为你还没有使用它。
4.0中的某些内容可能已经改变,如果转换器没有返回正确数量的参数,导致绑定失败,但我不确定这一点。