2012-02-16 19 views
4

を破るように見える、私は次のように出くわし:は私がトラブルだった従来のコンポーネントでは、従来の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; 
    } 
} 
+0

FeatureConverterをもう一度インストールしましたか? –

+0

はい - デバッガでヒットしたときにコンバーターが正しく動作していました。 –

+0

FeatureConverterのコードを確認できますか? – Phil

答えて

3

私はあなたが遭遇した問題を経験したことはありません。しかし、ScottGu's blogによると、Xaml/BamlパーサーはWPF 4.0の新しいパーサーに置き換えられました。したがって、3.5と4.0の間にいくつかの大きな変更がありますが、あなたの問題に対する具体的な言及は見つかりませんでした。

上記のブログから。

WPF 4は、新しいSystem.Xaml.dllの上に構築された新しいエンジンを制御& DataTemplates機能をXamlReader.Load()、BAMLローディングの実装を置き換えました。この取り組みの一環として、多くのバグを修正し、多くの機能を改善しました。

+0

私は今話していると思います。投稿を見ると、私は問題のXAMLがデータテンプレートで発生していると言及していませんでした。私は本当に重要だとは思っていませんでしたが、新しいControl/Data Template機能についてここに投稿したことに基づいて、私たちはそれを絞り込んでいると思います。 –

+1

まあ、実際には、私の「修正」が問題の一部を処理して以来、一日中これを調べていましたが、すべてではありません。正確な理由はまだ分かりませんが、最終的には問題にはなりません。現時点では、私の行動方針はこの部分を取り除き、依存関係をリファクタリングする可能性が高いためです。このポストは、私の焦土の決定を知らせるのに最も重要でしたので、答えとしてマークしています。パーサを改造して、このような奇妙で厄介なコーナーケースは、現在のベストプラクティスに従って、おそらく最も良く再加工されます。あなたと他のすべてのおかげです。 –

+0

私たちのコントロール外の変更のために休憩をしていたコードは、いつもイライラしています。 –

0

が、ConvertBackで:ここで

は、問題の値コンバータのコードですメソッドでは2つの値しか返されません。とにかくそれを使用していないので、第3のバインディングを削除してみてください。

4.0で変更された可能性があります。コンバータが正しい数のパラメータを返さない場合にバインディングが失敗することがありますが、これについてはわかりません。

+0

グッドキャッチ。これらの回帰は珍しいことではないようだ。MC2000は、パブリック・構造体・イン・XAMLインアセンブリ-と-importedfromtypelib属性を参照するが、私は、余分なパラメータとはまだありません喜びを削除した。与える –

+0

感謝をit try a Erik; Enabledプロパティのコードを公開することもできますか?それはパブリックセッターを持っていますか? – akjoshi

関連する問題