我将通过想象这个例子来尝试简化我正在进行的任务:
假设我们有以下模型类层次结构:
Animal
Lion
Snake
Bird
Run Code Online (Sandbox Code Playgroud)
...对应的ViewModels:
AnimalCollectionViewModel
AnimalViewModel
LionViewModel
SnakeViewModel
BirdViewModel
Run Code Online (Sandbox Code Playgroud)
......和相应的观点:
AnimalCollectionView
LionView
SnakeView
BirdView
Run Code Online (Sandbox Code Playgroud)
假设AnimalCollection包含一个填充了不同类型动物的对象的列表,并且在列表下方它具有用于设置所选动物的属性的属性网格.显然,属性网格将具有不同的属性,并且应在所选项目的类型更改时更改.
问题是:如何根据MVVM模式实现WPF中属性网格的切换?用什么机制?
目前,我在基础ViewModel(AnimalViewModel.PropertyGridType = {Lion,Snake,Bird})中有一个抽象枚举属性,派生类通过返回相应的值来实现.并且AnimalCollectionView根据此属性的值更改属性网格用户控件.像这样的东西:
...
<UserControl.Resources>
<Style x:Key="PropertyGridStyle" TargetType="ContentControl">
<Style.Triggers>
<DataTrigger Binding="{Binding PropertyGridType}" Value="Lion">
<Setter Property="Content">
<Setter.Value>
<view:LionPropertyGridView />
</Setter.Value>
</Setter>
</DataTrigger>
<DataTrigger Binding="{Binding PropertyGridType}" Value="Snake">
<Setter Property="Content">
<Setter.Value>
<view:SnakePropertyGridView />
</Setter.Value>
</Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</UserControl.Resources>
<ContentControl Style="{StaticResource PropertyGridStyle}" />
Run Code Online (Sandbox Code Playgroud)
...
但我不确定这是否是正确的做法.(至少我不喜欢引入辅助枚举属性.是否可以根据ViewModel类型推断出必要的用户控件?)任何人都可以建议其他选项吗?提前致谢!
我正在编写一份包含嵌入式svg图表的报告.该图是使用相对坐标绘制的,因此当浏览器窗口调整大小时,图表会很好地调整大小.唯一的例外是文本 - 它保持不变.是否可以在svg中绘制可调整大小的文本?
我是否正确使用NHibernate(或任何其他ORM)消除了DAL的必要性?或不?
我正在将Canvas的Background属性绑定到某些SelectedColorItem对象,如下所示:
<Canvas>
<Canvas.Style>
<Style TargetType="Canvas">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=SelectedColorItem,Mode=OneWay,Converter={StaticResource isNullConverter}}"
Value="True">
<Setter Property="Background" Value="Red" />
</DataTrigger>
</Style.Triggers>
</Style>
</Canvas.Style>
<Canvas.Background>
<SolidColorBrush Color="{Binding SelectedColorItem.MediaColor}" />
</Canvas.Background>
</Canvas>
Run Code Online (Sandbox Code Playgroud)
它有效 - 它显示所选的颜色.什么不起作用我写的DataTrigger表明SelectedColorItem为null.
最简单的isNullValueConverter也可以工作 - 它可以用Label变化:
<Label Content="{Binding Path=SelectedColorItem,Mode=OneWay,Converter={StaticResource isNullConverter}}" />
Run Code Online (Sandbox Code Playgroud)
它显示True,当SelectedColorItem为null时,否则为False.
有人能告诉我触发器有什么问题吗?
PS SelectedColorItem是ColorItemClass的一个实例,它包含一个MediaColor属性:
public System.Windows.Media.Color MediaColor {get;set;}
Run Code Online (Sandbox Code Playgroud) 我正在实现类似自动提示控件的东西:我有一个包含a TextBox和a 的用户控件ListBox.当用户输入文本时,我正在处理System.Windows.Interactivity行为并填写ListBox一些值...
一切正常......但我想使用户能够选择的项目ListBox(即设置Focus在ListBox按下向下箭头键时).
我知道可以处理代码隐藏.cs文件中的KeyPressDown事件TextBox但是我该如何避免这种情况?