2

私のアプリケーションでは、ユーザーの承認レベルに応じてボタンを表示/非表示にしたいと考えています。ユーザーがチーム リーダーの場合、ボタンが表示されます。ユーザーがチーム リーダーでない場合は表示されません。

BooleanToVisibilityConverterリソース ディクショナリで定義されている を 使用して、この問題を解決しようとしました。

<BooleanToVisibilityConverter x:Key="VisibilityConverter" />

コンバーターの実装:

<Button Grid.Row="1" Grid.Column="5"
Click="TeamLeader_Click" Visibility="{Binding IsTeamLeader, Converter={StaticResource
VisibilityConverter}}" Style="{StaticResource ButtonStyleMenu}" />

コード ビハインド クラスでは、依存関係プロパティを使用してボタンの表示を変更しています。

public static readonly DependencyProperty IsTeamLeaderProperty =
DependencyProperty.Register("IsTeamLeader", typeof(bool),
typeof(MainMenu), new FrameworkPropertyMetadata(false));

public bool IsTeamLeader
{
    get { return (bool)GetValue(IsTeamLeaderProperty); }
    set { SetValue(IsTeamLeaderProperty, value); }
}

ユーザーコントロールの「ロードイベント」で、プロパティを初期化しfalseてボタンを折りたたむ必要があります。

private void ViewPage_Loaded(object sender, RoutedEventArgs e)
{
   this.IsTeamLeader = false;
}

しかし、これはうまくいきません。起動時のプロパティの値に関係なくIsTeamLeader、ボタンは常に表示されます。

それで、私を助けて、どこで間違いを犯したかのヒントを教えてもらえますか? または、依存関係プロパティの実装に問題BooleanToVisiblityConverterがありますか? または何?

ありがとうございました!

4

2 に答える 2

2

DataContext次のように設定する必要があります。

this.DataContext = this;
于 2012-11-02T20:31:10.103 に答える
0

(コメントを読んで)データコンテキストを設定していないようです。:-)

ただし、将来この問題をデバッグするには、デバッガーの既知の問題から戻る必要があります。説明させてください

  1. コンバーターにブレークポイントを設定します。呼び出されていない場合、ソースでバインディングが失敗しています。あなたが見つけたものなど。それが機能している場合(そして戻り値が適切である場合)、#2に進みます。
  2. 依存関係プロパティに変更されたハンドラーを設定し、そこに次のようなブレークポイントを設定します。

        public bool MyBoolProperty
        {
            get { return (bool)GetValue(MyBoolPropertyProperty); }
            set { SetValue(MyBoolPropertyProperty, value); }
        }
    
        /// <summary>
        /// Identifies the MyBoolProperty dependency property.
        /// </summary>
        public static readonly DependencyProperty MyBoolPropertyProperty =
            DependencyProperty.Register(
                "MyBoolProperty",
                typeof(bool),
                typeof(MyClass),
                new PropertyMetadata(false, OnMyBoolPropertyPropertyChanged));
    
        /// <summary>
        /// MyBoolPropertyProperty property changed handler.
        /// </summary>
        /// <param name="d">MyClass that changed its MyBoolProperty.</param>
        /// <param name="e">Event arguments.</param>
        private static void OnMyBoolPropertyPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            MyClass source = d as MyClass; // Breakpoint here...
            bool value = (bool)e.NewValue;
        }
    

イベントが発生しない場合...依存関係に入るデータとタイプとして期待するデータの間にタイプの不一致があります。

上記の例では値型を使用しており、その型との不一致は難しいため、そうではない可能性があります...ただし、ソースにインターフェイスとしてデータがあり、依存関係プロパティがインターフェイスをターゲットオブジェクトに変換できない場合があります。それが期待するもの。

于 2012-11-02T18:26:42.210 に答える