1

我有一个内容控件,它根据当前状态显示动态内容。这一切都很好,但在设计时,我希望它显示默认状态。有什么办法可以使用ValueConverterorFallbackValue或其他东西来做到这一点?

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和排序的模型

这些是我做的步骤。

  • 确保视图模型有一个无参数的构造函数
  • 在构造函数中分配ContentControl Content绑定值(State在您的情况下)要显示的默认 ViewModel。

例子:

public LicenceAgreementControl() {
  State = new NewViewModel();
}
  • d:DataContext从您的主 xaml 文件中删除所有出现的。
  • 使用一些键将视图模型创建为 xaml 中的普通旧资源,并将其分配DataContext给您的ContentControl

例子:

<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 中删除作为资源创建的视图模型,还可以DataContextContentControl.

现在你只需要

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

在 xaml 文件中,您应该完成(仍然需要 ctor 使用您希望在中显示的默认视图模型设置 State 属性ContentControl

于 2013-03-22T15:48:34.033 回答