を破るように見える、私は次のように出くわし:は私がトラブルだった従来のコンポーネントでは、従来のXAML
<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に移行したことだけでした。私はMode="TwoWay"
をXAMLのマルチバインディングから削除することでこれを修正することができました。しかし、私は偶然にプログラミングに立ち向かうことはできません。なぜこれが起こったのか知りたい。
なぜこのXAMLとコードが3.5では機能し、4では機能しないのかについては誰にも分かりませんか?他の潜在的な説明を考えることができますが、私はそれを聞いていますが、XAMLもそのコントロールの背後にあるコードも、3.5にデプロイされてから(機能的に)変更されていません。
編集:私はあなたがMultiValueのコンバータに結合された三つの値を持っているので、これが起こってかもしれないと思う
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;
}
}
FeatureConverterをもう一度インストールしましたか? –
はい - デバッガでヒットしたときにコンバーターが正しく動作していました。 –
FeatureConverterのコードを確認できますか? – Phil