将内容绑定到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}"
我终于让它工作了,
这是评论中许多事情的组合。希望这能解决你的问题。
假设运行时一切正常,请查看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
中显示)