2

私のアプリケーションでは、隠しておきたい(または折りたたんで、必要になるまで見えないようにしたい)スタックパネルがあり、ユーザーがボタンをクリックすると表示されるようになります。

私が遭遇した問題は、MVVM テクニックの初歩的な知識を使用して、スタックパネルの可視性をビューモデルのプロパティにバインドすることです。プロパティは可視性タイプであり、ボタンは ICommand インターフェイスを利用するカスタム コマンドを使用してビューモデルのメソッドを呼び出します。この段階では、スタックパネルがバインドされている可視性プロパティの値を変更するだけです。

コマンド自体がメソッドを正常に呼び出しており、可視性プロパティが変更されていることを確認しましたが、可視性プロパティをバインドしたスタックパネルが表示されることを拒否しています。

私が使用しているコードの実例を構築しようとします:

<Button Content="Show StackPanel" Command="{Binding Path=ShowPanelCommand}" />
<StackPanel Visibility="{Binding Path=panelVisibility}" />

ビューモデルの Command によって呼び出されるメソッドでは、次のようになります。

public Visibility panelVisibility { get; set; }

public void ShowThePanel()
{
    panelVisibility = Visibility.Visible;
}

私は C#/.NET とプログラミング全般にまったく慣れていません。

短い時間で多くのことを学びましたが、たまにこのような壁にぶち当たります。

ガイド付きの支援は、私にとって非常に貴重です。

この質問で概説した結果を達成するためのより良い/より効率的な手法の提案を受け入れますが、理解のために同じように、使用しようとしたときに見逃したものや間違ったことを知りたいですこの特定の方法。

助けてくれてありがとう。

4

2 に答える 2

0

あなたがする必要があるのは、あなたのにINotifyPropertyChangedViewModelを実装することです:

public class YourViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    public virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;

        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    public void ShowThePanel()
    {
        PanelVisibility = Visibility.Visible;
    }

    private Visibility panelVisibility;

    public Visibility PanelVisibility
    {
        get
        {
            return panelVisibility
        }
        set
        {
            panelVisibility = value;
            OnPropertyChanged("PanelVisibility");
        }
    }
}

次に、あなたのXAML

<StackPanel Visibility="{Binding Path=PanelVisibility, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />

編集:

INotifyPropertyChanged インターフェイスは、プロパティ値が変更されたことをクライアント (通常はバインディング クライアント) に通知するために使用されます。たとえば、FirstName というプロパティを持つ Person オブジェクトについて考えてみます。一般的なプロパティ変更通知を提供するために、Person 型は INotifyPropertyChanged インターフェイスを実装し、 FirstName が変更されたときにPropertyChangedイベントを発生させます。バインドされたクライアントとデータ ソースの間のバインドで変更通知が発生するようにするには、バインドされた型が次のいずれかである必要があります。

  • INotifyPropertyChanged インターフェイスを実装します (推奨)。
  • バインドされた型の各プロパティに変更イベントを提供します。

両方を行わないでください。

于 2013-05-16T08:28:07.903 に答える
0

.net 4 以下を使用していて、viewModel 基本クラスで INotifyPropertyChanged コードをセットアップし、それを panelVisibility プロパティのセッター メソッドで呼び出していると仮定します。

INotifyPropertyChanged は、リッスンしているコントロールに変更が必要であることをバインディングが通知できるようにするメカニズムです。

ベースビューモデルの例

public class baseViewModel : INotifyPropertyChanged
{
    // boiler-plate
    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
    }
}

ここに iNotifyPropertyChanged インターフェイスを実装して呼び出す方法についての情報も山ほどあります INotifyPropertyChanged の実装 - より良い方法はありますか?

.net 4.5 は少し異なります。私は 4.5 を使ったことがないので、それについてのフィードバックはできません

于 2013-05-16T08:34:49.370 に答える