5

非常に奇妙な問題があり、非常に混乱しています。以下のコードのように、[Button] を作成し、その [Canvas.LeftProperty] を [Entity.X] と [Entity.Z] にマルチバインドしました。 ] クラスは [INotifyPropertyChaned] を実装しています。

Convert() メソッドでうまく動作し、[Entity.X] と [Entity.Z] が [Canvas.LeftProperty] に正しく渡されます。

しかし、問題は: Canvas.SetLeft() メソッドで [Button] の位置を変更したとき、ConvertBack() メソッドが起動されましたが、正しい値が [Entity] に渡されませんでした。 Entity.X] の set セクションは、常に古いもののように見えました。

PS:同様の質問を見つけましたが、解決されませんでした.. :(

同様の質問: http://social.msdn.microsoft.com/Forums/zh-CN/wpf/thread/88B1134B-1DAA-4A54-94ED-BD724724D1EF

xaml:

<Canvas>
  <Button x:Name="btnTest">
<Canvas>

バインディング コード:

private void Binding()
{
 var enity=DataContext as Entity;
 var multiBinding=new MutiBinding();
 multiBinding.Mode=BindingMode.TwoWay;
 multiBinding.Converter=new LocationConverter();
 multiBinding.Bindings.Add(new Binding("X"));
 multiBinding.Bindings.Add(new Binding("Z"));
 btnTest.SetBinding(Canvas.LeftProperty,multiBinding);
}

コンバータ:

public class LocationConverter: IMultiValueConverter
{
  public object Convert(object[] values, TypetargetType,object parameter, CultureInfo culture)
  {
    return (double)values[0]*(double)values[1];
  }

  public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
  {
    return new object[]{ (double)value,Binding.DoNoting};//!!value here is correct
  }
}

実在物:

public class Entity:INotifyPropertyChanged
{
  private double x=0d;
  private double z=0d;

  public double X
  {
    get{ return x;}
    set{ 
         x=value;//!!value here is not correctly passed
         CallPropertyChanged("X");}
       } 

  public double Z
  {
    get{ return z;}
    set{ 
         z=value;//!!value here is not correctly passed
         CallPropertyChanged("Z");}
       } 
  } 

  public event PropertyChangedEventHandler PropertyChanged;

  private void CallPropertyChanged(String info)
  {
     if(PropertyChanged!=null)
        PropertyChanged(this,new PropertyChangedEventArgs(info));
  }
}

4

1 に答える 1

9

ConvertBack メソッドで使用する MultiBinding 内の各 Binding で Binding モードを指定する必要があります。したがって、上記に投稿したコードについては、「バインディング コード」を次のように変更することで問題が解決するはずです。

private void Binding()
{
 var enity=DataContext as Entity;
 var multiBinding=new MutiBinding();
 multiBinding.Mode=BindingMode.TwoWay;
 multiBinding.Converter=new LocationConverter();
 multiBinding.Bindings.Add(new Binding("X"){Mode = BindingMode.TwoWay});
 multiBinding.Bindings.Add(new Binding("Z"));
 btnTest.SetBinding(Canvas.LeftProperty,multiBinding);
}
于 2013-06-02T20:26:18.540 に答える