System.Windows.Pointのような非常に単純な複合型のプロパティを持つDependencyProperties(またはINotifyPropertyChanged)を使用するViewModelがあります。 単純な複合型はDependencyPropertiesまたはINotifyPropertyChangedを使用せず、その方法をそのままにしています(これは私のコントロール外です)。WPF親プロパティを置き換えるプロパティのプロパティへの双方向バインディング
ここで私がやりたいことは、ポイントのXプロパティとYプロパティに双方向データバインディングを作成することですが、これらのいずれかが変更された場合、ちょうど更新するのではなく、メンバー。ただ、説明のための
コードサンプル:
<Window ...>
<StackPanel>
<TextBox Text="{Binding TestPoint.X, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:MainWindow}}, StringFormat=\{0:F\}}"/>
<TextBox Text="{Binding TestPoint.Y, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:MainWindow}}, StringFormat=\{0:F\}}"/>
<!-- make following label update based on textbox changes above -->
<Label Content="{Binding TestPoint, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:MainWindow}}}"/>
</StackPanel>
</Window>
コードビハインド:
public partial class MainWindow : Window
{
public Point TestPoint
{
get { return (Point)GetValue(TestPointProperty); }
set { SetValue(TestPointProperty, value); }
}
public static readonly DependencyProperty TestPointProperty = DependencyProperty.Register("TestPoint", typeof(Point), typeof(MainWindow), new PropertyMetadata(new Point(1.0, 1.0)));
}
私が考えていた何がテストポイントプロパティに直接両方のTextBoxを結合して、唯一の特定をフィルタリングするIValueConverterを使用していましたX値を変更するときにY値が存在しないため、ConvertBackメソッドに問題があります。
私はこれが本当に簡単な解決策でなければならないと感じています。
編集:
上記のコードは、単に簡略化した例であり、実際のアプリケーションは、より複雑です。複合型は約7つのメンバを持ち、一般的にアプリケーションを通して使用されるため、個々のメンバに分割することは正しく行われません。また、依存関係プロパティのOnChangedイベントに依存して他の更新を呼び出すので、クラス全体を置き換える必要があります。
あなたはコンバータの中で他の値を保持することができます、あなたはそれを試してみましたか? – WPFUser
コンバーターのメンバーであることを意味しますか?私はそれについて考えなかった。私は、フィールドごとに別々のコンバータインスタンスを用意する必要があると思います。それは安全ですか?ConvertBackの実行時にConvert中に保存されたY値が有効であることが保証されていますか? – markyxl
'X'と' Y'プロパティにバインドするときに潜在的なメモリリークがあることに注意してください。 'Point'は' INotifyPropertyChanged'ではなく、 'DependencyProperties'もないので、Bindingは' PropertyDescriptor'を使用します。これはBindingが 'OneTime'でない場合にリークを引き起こす可能性があります:http://stackoverflow.com/questions/18542940/can-bindings-create-memory-leaks-in-wpf – wkl