5

現在、WPFアプリケーションにちょっとひどい問題があります...

コンポーネントの詳細を編集するために使用されるカスタムUserControlがあります。有効にしないことから始めて、ユーザーが編集するコンポーネントを選択するとすぐに有効になるはずです。

問題は、IsEnabledプロパティが変更されないことです。

これが私のコードです:

<my:UcComponentEditor Grid.Column="1" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"  
                        IsEnabled="{Binding EditorEnabled}"
                              DataContext="{Binding VmComponent}" />

EditorEnabledは私のViewModel(VmComponent)のプロパティであり、デフォルトではfalseであり、ユーザーがコンポーネントを選択または作成するとtrueになります。

念のために言っておきますが、私のViewModelでは次のようになっています。

private Boolean _editorEnabled = false;

    public Boolean EditorEnabled
    {
        get { return _editorEnabled; }
        set 
        {
            _editorEnabled = value;
            OnPropertyChanged("EditorEnabled");
        }
    }

アプリを起動しようとすると、UserControlが起動しています...有効になっています。どこにでもブレークポイントを追加しましたが、EditorEnabledは最初からfalseです。

また、何が起こっているのかを理解するために、ひどくばかげたことをしました。コンバーターを作成し(非常に便利で、ブール値をブール値に変換します)、ブレークポイントを設定しました。コードに到達することはありません。

<my:UcComponentEditor Grid.Column="1" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"  
                        IsEnabled="{Binding EditorEnabled, Converter={StaticResource BoolConverter}}"
                              DataContext="{Binding VmComponent}" />

これはおそらく、コンバーターに到達することがないため、プロパティisEnabledが設定されないことを意味します。

そこに何か問題がありますか?私は約1週間前にWPFで作業を開始したため、重要な何かを見逃した可能性があります...

どうもありがとうございました:-)

4

3 に答える 3

3

You should add a DependencyProperty for the binding to work properly. See here for more information.

Code-behind:

public static readonly DependencyProperty EditorEnabledDependencyProperty = DependencyProperty.Register("EditorEnabled", typeof(bool), typeof(UcComponentEditor), new PropertyMetadata(false));

public bool EditorEnabled
{
    get { return (bool)base.GetValue(UcComponentEditor.EditorEnabledDependencyProperty); }
    set { base.SetValue(UcComponentEditor.EditorEnabledDependencyProperty, value); }
}
于 2011-03-17T12:07:26.213 に答える
1

私が思う問題は、ユーザーコントロールのDataContextプロパティにバインディングがあることです。つまり、EditorEnabledプロパティはVmComponentオブジェクトのプロパティである必要があります。少なくともそれが私の問題でした。

これを回避するために、IsEnabledのバインディングに適切なソースを指定しました。それを実行すると、コントロールが期待どおりに機能し始めました。

お役に立てば幸いです。

于 2012-08-25T12:14:24.083 に答える
0

たとえば、コントロールをDockPanelにカプセル化すると、DependencyPropertyが不要になります。

その後、カスタムコントロールの代わりに、ドックパネルを使用してバインディングを実行できます。DockpanelでIsEnabledにバインドされた変数を設定すると、Dockpanelに含まれるアイテムが自動的に有効または無効になります。

于 2014-02-25T08:03:45.883 に答える