如果没有视图模型

时间:2016-02-25 15:07:03

标签: wpf xaml mvvm

我怀疑这个问题已在其他地方得到解答,但我找不到它的生命,所以请耐心等待我。我对MVVM& XAML所以,如果我完全错误地吠叫,请告诉我。

我正在开发一个不同级别的教育应用程序。在每个级别的打开屏幕上有一个按钮(绑定到VM中的命令),该按钮显示一个模式弹出窗口,其中包含有关该级别的信息。

窗口总是看起来一样 - 有一个标题,一个图标,然后是一些描述性的“东西”。这是导致我困难的“东西” - 有时是文本,有时是文本和图像,格式不同等等。

目前我有一个Window控件,其标题和图标绑定到视图模型上的属性,但正如我目前所看到的那样,“stuff”的视觉特性使它成为另一个视图,所以我放了一个contentpresenter进入窗户,这就是我脱离困境的地方。

“stuff”没有与之关联的视图模型,因为它由不同视觉事物的随机集合组成 - 图像,文本等,因此我无法将内容设置为viewmodel并让隐式datatemplate做它。

当没有相应的视图模型时,如何选择我想在窗口中显示“东西”的视图?或者,我是否完全以错误的方式解决这个问题?

稍微冗长的问题,但我希望这是有道理的。

由于

麦克

2 个答案:

答案 0 :(得分:0)

如果您还没有查看模型,可以在运行时使用Content属性添加/删除元素。
在其他情况下,您可以使用ContentPresenter的ContentTemplateSelector属性。

<ContentPresenter ContentTemplateSelector="{StaticResource templateSelector}" />

答案 1 :(得分:0)

您可以使用DataTriggers更改模板。假设您有一个视图模型,其中包含一个属性,您希望使用该属性来确定控件的显示方式,为了参数I&#39,请将其设为枚举:

<Control>

    <Control.Style>
        <Style TargetType="{x:Type Control}">

            <Style.Triggers>
                <DataTrigger Binding="{Binding Flag}" Value="{x:Static local:SomeFlag.TypeA}">
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate>
                                <TextBlock Text="I am type A" />
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </DataTrigger>

                <DataTrigger Binding="{Binding Flag}" Value="{x:Static local:SomeFlag.TypeB}">
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate>
                                <TextBlock Text="I am type B" />
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </DataTrigger>

                <DataTrigger Binding="{Binding Flag}" Value="{x:Static local:SomeFlag.TypeC}">
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate>
                                <TextBlock Text="I am type C" />
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </DataTrigger>

            </Style.Triggers>
        </Style>
    </Control.Style>

</Control>

您需要做的就是为父控件/窗口添加样式,然后为每个值添加数据触发器:

{{1}}