小编Nic*_*olo的帖子

WPF:根据相应的ViewModels(MVVM)切换UserControls

我将通过想象这个例子来尝试简化我正在进行的任务:

假设我们有以下模型类层次结构:

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类型推断出必要的用户控件?)任何人都可以建议其他选项吗?提前致谢!

wpf mvvm

20
推荐指数
1
解决办法
1万
查看次数

如何动态调整svg中的文本大小?

我正在编写一份包含嵌入式svg图表的报告.该图是使用相对坐标绘制的,因此当浏览器窗口调整大小时,图表会很好地调整大小.唯一的例外是文本 - 它保持不变.是否可以在svg中绘制可调整大小的文本?

graphics diagram svg

5
推荐指数
1
解决办法
3285
查看次数

NHibernate删除了DAL?

我是否正确使用NHibernate(或任何其他ORM)消除了DAL的必要性?或不?

nhibernate data-access-layer

4
推荐指数
2
解决办法
1387
查看次数

WPF:当绑定值为null时,在DataTrigger中设置Canvas颜色

我正在将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)

wpf binding

2
推荐指数
1
解决办法
3108
查看次数

在没有代码隐藏的情况下按下键时将焦点设置在另一个控件上

我正在实现类似自动提示控件的东西:我有一个包含a TextBox和a 的用户控件ListBox.当用户输入文本时,我正在处理System.Windows.Interactivity行为并填写ListBox一些值...

一切正常......但我想使用户能够选择的项目ListBox(即设置FocusListBox按下向下箭头键时).

我知道可以处理代码隐藏.cs文件中的KeyPressDown事件TextBox但是我该如何避免这种情况?

wpf controls focus

2
推荐指数
1
解决办法
2209
查看次数

标签 统计

wpf ×3

binding ×1

controls ×1

data-access-layer ×1

diagram ×1

focus ×1

graphics ×1

mvvm ×1

nhibernate ×1

svg ×1