一貫性のないバインディング結果が得られるのはなぜですか
-
05-07-2019 - |
質問
トグルボタンのあるコントロールテンプレートがあります。このトグルボタンには、IsCheckedプロパティが1つの方法で依存関係プロパティにバインドされています。依存関係プロパティを明示的に設定すると、バインディングが機能します。
問題は、 UIのトグルボタンを操作した後、依存関係プロパティを明示的に設定した場合、バインディングはIsCheckedプロパティを更新しないことです。
TwoWayバインディングを使用して問題なく動作する回避策があります。私の質問は、なぜこのように振る舞うのですか?何か不足していますか? Silverlightのバインディングメカニズムにバグはありますか?
編集してスニペットを含める:
ControlTemplateのバインディングは次のようになります(TemplateBindingに置き換えることができます)
<ToggleButton x:Name="PlayPause" Grid.Column="0"
IsChecked="{Binding Paused, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}"
HorizontalAlignment="Center"
Width="50" Height="50"/>
依存関係プロパティの明示的な設定は、かなり沼地の標準です:
myComponent.Paused = true;
解決
WPFは、ターゲットプロパティ(この場合はIsChecked)が変更されると、一方向バインディングを削除します。 Silverlightは、IsCheckedが変更されたときにバインディングを保持するために使用されていました。一時停止が後で設定された場合、この値はIsCheckedも上書きします。
あなたによると、SilverlightはWPFの動作に戻ったようです。しかたがない。個人的に、バインドされたプロパティの変更はバグだと考えています。プロパティが同期することを意図していない場合は、より良い解決策があります。
他のヒント
- TwoWayバインディングを使用する必要があります
- Pausedプロパティを含むオブジェクトがINotifyPropertyChangedをサポートしていることを確認してください。
- 一時停止のセッターがPropertyChangedイベントをトリガーすることを確認します
所属していません StackOverflow