3

これは少し奇妙な問題です。(.NET 3.5sp1)

3つのToggleButtonを含むUserControlがあり、それぞれにIsCheckedがUserControl自体の異なる依存関係プロパティにバインドされています。これらのうち2つはデフォルトでtrueになり、1つはデフォルトでfalseになります。

アプリケーションの起動時に、UserControl自体(したがってそのコンテンツ)は無効になります。後で有効にすると、3つのボタンすべてが押されていないように見えます。ただし、コードプロパティはまだ正しい状態です。

ボタンがクリックされると、プロパティが適切に切り替わり、UI(そのボタンのみ)が更新されて正しい状態が反映されます(つまり、押されていないように見えるが、実際のバインド値を持つボタンをクリックしても、目に見える変化は表示されません初めてですが、バインドされた値をfalseに更新します)。「グリッチ」ボタンを2回押すと、正常に動作します(スイッチがオンになると、ボタンは期待どおりに押し込まれます)。

起動時にUserControlが無効になっていない場合、ボタンは正しく表示されます(プロパティの状態に応じて)。

残念ながら、UserControlは起動時に無効になっているはずなので、有効にして起動することはできません。私は別の解決策を望んでいます。何か案は?

(プロパティをデフォルトでfalseに設定してから、ユーザーコントロールのLoadイベントでtrueに設定しようとしました。違いはありません。)

4

2 に答える 2

2

.NET 4.0 でも同様の奇妙な問題が発生します。コードをバインドした場合ではなく、コードを介して設定した場合にのみ問題が発生することに気付きました。そのIsEnabledため、代わりにコードをそのように変更できれば、問題は解決されると思います。

それ以外の場合は、回避策が必要であると考えており、その方法の 1 つを次に示します。UserControl初めてDataContext をリセットするIsEnabledは に設定されていTrueます。

public UserControl1()
{
    InitializeComponent();

    DependencyPropertyDescriptor descriptor =
        DependencyPropertyDescriptor.FromProperty(UserControl1.IsEnabledProperty, 
                                                  typeof(UserControl1));
    EventHandler isEnabledChanged = null;
    isEnabledChanged = new EventHandler(delegate
    {
        if (IsEnabled == true)
        {
            descriptor.RemoveValueChanged(this, isEnabledChanged);
            var dataContext = this.DataContext;
            this.DataContext = null;
            this.DataContext = dataContext;
        }
    });
    descriptor.AddValueChanged(this, isEnabledChanged);
}
于 2011-02-11T00:16:19.917 に答える
0

私は「やや」似たような状況に遭遇し、次の SO 返信が私の場合により適切であることがわかりました。これにより多くの手間が省けるので、このソリューションを見ている人が気付いていない場合に備えて、ここで参照すると役立つはずです。

WPF ToggleButton の不適切なレンダリング動作

乾杯

マンスール

于 2014-12-31T08:01:47.197 に答える