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

本文关键字:回退 默认值 ValueConverter 绑定 | 更新日期: 2023-09-27 18:05:32

我有一个基于当前状态显示动态内容的内容控件。这一切都很好,但在设计时,我希望它显示默认状态。我能不能用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,它编译ok,但我仍然在设计器中看不到任何东西?

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

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

我终于让它工作了,

这是评论中许多事情的组合。希望这能解决你的问题。

假设运行时一切正常,请查看ContentControl中显示的模型和排序

这些是我所做的步骤。

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

的例子:

public LicenceAgreementControl() {
  State = new NewViewModel();
}

  • 从你的主xaml文件中删除所有出现的d:DataContext
  • 在xaml中创建视图模型作为一个普通的旧资源,并将其作为DataContext分配给ContentControl

的例子:

<Window.Resources>
  <local:LicenceAgreementControl x:Key="LicenceAgreementControl" />
</Window.Resources>
<ContentControl Content="{Binding State}" DataContext="{Binding Source={StaticResource LicenceAgreementControl}}" />

  • 在视图模型构造函数中设置断点
  • Open Solution in Expression Blend
  • 现在在Visual Studio中,工具->附加到进程…->选择在列表中混合->点击附加
  • 切换回混合模式。关闭并打开xaml文件。应该调用Visual Studio中的断点
  • 逐步通过,我注意到一个异常被调用,我可以绕过IsInDesignState检查。
  • 如果你没有异常,你应该看到默认视图模型的视图加载在混合设计器(同样适用于Visual Studio设计器)

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

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

现在你所需要的是

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

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