内容绑定到ValueConverter的回退或默认值

时间:2013-03-22 13:47:49

标签: c# wpf xaml binding contentcontrol

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

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}"

1 个答案:

答案 0 :(得分:1)

好的,我终于开始工作了,

这是评论中的多个内容的组合。希望这能为您解决。

假设所有运行时都很好w.r.t查看ContentControl中显示的模型并排序

这些是我所做的步骤。

  • 确保为视图模型提供无参数构造函数
  • 在构造函数中指定ContentControl Content绑定值(在您的情况下为State)将显示默认的ViewModel。

示例:

public LicenceAgreementControl() {
  State = new NewViewModel();
}
  • 从主xaml文件中删除所有出现的d:DataContext
  • 使用某个键在xaml中将视图模型创建为普通旧资源,并将其指定为DataContext <{1}}到ContentControl

示例:

<Window.Resources>
  <local:LicenceAgreementControl x:Key="LicenceAgreementControl" />
</Window.Resources>
<ContentControl Content="{Binding State}" DataContext="{Binding Source={StaticResource LicenceAgreementControl}}" />
  • 在View Model Constructor中放置一个断点
  • 在Expression Blend中打开解决方案
  • 现在在Visual Studio中,工具 - &gt;附加到流程... - &gt; “在列表中选择混合” - &gt;单击“附加”
  • 切换回混合。关闭并打开xaml文件。应调用Visual Studio中的断点
  • 单步执行,我注意到一个异常被调用,我可以通过IsInDesignState检查来绕过它。
  • 如果没有异常,您应该会看到默认视图模型的视图在混合设计器中加载(同样适用于Visual Studio设计器)

现在提供你可以看到设计时加载的视图很好,我们只能更新我们的设计时间方法,否则问题在于当前正在设置视图模型的方式,需要首先对其进行排序

^^一旦上面的东西工作正常。要将此作为仅设计功能,请从xaml中删除作为资源创建的视图模型,并且还可以从DataContext中删除显式ContentControl集。

现在你需要的只是

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

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