1

現在の状態に基づいて動的コンテンツを表示するコンテンツコントロールがあります。これはすべて正常に機能しますが、設計時にはデフォルトの状態を表示したいと思います。ValueConverterまたはFallbackValueまたは何かを使用してこれを行う方法はありますか?

XAML

<ContentControl Content="{Binding State, 
              Converter={StaticResource InstallationStateToControlConverter}}" />

C#

class InstallationStateToControlConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {            
        //return controls depending on the state
        switch ((InstallationState)value)
        {
            case InstallationState.LicenceAgreement:
                return new LicenceAgreementControl();
            default:
                return new AnotherControl();
        }
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

アップデート

Vivの質問に従って、XAMLに以下を追加しました。コンパイルは正常ですが、デザイナーにはまだ何も表示されませんか?

d:DataContext="{d:DesignInstance Type=local:LicenceAgreementControl, IsDesignTimeCreatable=True}"
4

1 に答える 1

1

わかりました、ようやく機能しました。

コメントからの複数の組み合わせでした。これで解決することを願っています。

ContentControl表示されているモデルと並べ替えを表示するために、すべてのランタイムが問題ないと仮定します

これらは私が行った手順です。

  • ビュー モデルの引数なしのコンストラクターがあることを確認します。
  • コンストラクターで、表示されるデフォルトの ViewModel をContentControl ContentBinding Value (Stateあなたの場合) に割り当てます。

例:

public LicenceAgreementControl() {
  State = new NewViewModel();
}
  • d:DataContextメインの xaml ファイルから をすべて削除します。
  • View Model を xaml で単純な古いリソースとしていくつかのキーを使用して作成し、それDataContextContentControl

例:

<Window.Resources>
  <local:LicenceAgreementControl x:Key="LicenceAgreementControl" />
</Window.Resources>
<ContentControl Content="{Binding State}" DataContext="{Binding Source={StaticResource LicenceAgreementControl}}" />
  • ビュー モデル コンストラクターにブレークポイントを設定する
  • Expression Blend でソリューションを開く
  • Visual Studio では、ツール -> プロセスにアタッチ... -> [リストでブレンドを選択] -> [アタッチ] をクリックします。
  • ブレンドに戻ります。xaml ファイルを閉じて開きます。Visual Studio のブレークポイントを呼び出す必要があります
  • ステップスルーすると、 IsInDesignState チェックでバイパスできる例外が呼び出されることに気付きました。
  • 例外がなければ、既定のビュー モデルのビューがブレンド デザイナーに読み込まれます (Visual Studio デザイナーにも同じことが当てはまります)。

設計時のビューが正常にロードされていることを確認できれば、設計時のメソッドのみを更新できます。そうでない場合、問題はビュー モデルが現在セットアップされている方法にあり、最初にそれを整理する必要があります。

^^上記のものは正常に動作します。これを設計のみの機能として作成するには、xaml からリソースとして作成されているビュー モデルを削除し、明示的なDataContextセットを から削除することもできContentControlます。

今必要なのは

d:DataContext="{d:DesignInstance Type=local:LicenceAgreementControl, IsDesignTimeCreatable=True}"

xaml ファイルでこれを行う必要があります (引き続き、ctor が に表示するデフォルトのビュー モデルで State プロパティを設定する必要がありますContentControl) 。

于 2013-03-22T15:48:34.033 に答える