非常に奇妙な問題があり、非常に混乱しています。以下のコードのように、[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));
}
}