首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用一个Viewmodel,多个视图/页面可以绑定到Viewmodel中的变量

问如何使用一个Viewmodel,多个视图/页面可以绑定到Viewmodel中的变量
EN

Stack Overflow用户
提问于 2020-10-13 22:05:39
回答 2查看 194关注 0票数 0

困惑的嵌入式程序员在这里

我正在制作一个WPF应用程序,它将有多个视图/页面。我希望视图是全屏,并能够通过按钮点击。

视图1:登陆欢迎页面,打开下一步按钮

视图2:选择Comport页面,用户选择Comport,然后单击

视图3: Comport应用程序主页面

我不想创建3个单独的视图模型,因为视图3需要从视图2中选择相应的视图。我发现切换视图的唯一方法是切换数据上下文。但是,我不能访问其他视图模型中的数据。

如果有人知道如何实现这一点,请让我知道!

EN

回答 2

Stack Overflow用户

发布于 2020-10-14 05:13:12

如果您不想要三个不同的视图模型,您可以向主视图模型添加一个属性来决定显示哪个视图:

代码语言:javascript
复制
public class MainViewModel : INotifyPropertyChanged
{
    public string SharedSampleProperty { get; set; } = "Some value that is shared across all views...";

    private View _currentView = View.First;
    public View CurrentView
    {
        get => _currentView;
        set { _currentView = value; NotifyPropertyChanged(); }
    }

    public event PropertyChangedEventHandler PropertyChanged; 
    private void NotifyPropertyChanged([CallerMemberName] string propertyName = "") =>
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));

}

public enum View 
{
    First,
    Second,
    Third
}

在视图中,然后可以使用ContentControl和Style,它们根据此属性的值设置ContentTemplate:

代码语言:javascript
复制
<ContentControl Content="{Binding}">
    <ContentControl.Resources>
        <DataTemplate x:Key="{x:Static local:View.First}">
            <TextBlock>1...</TextBlock>
        </DataTemplate>
        <DataTemplate x:Key="{x:Static local:View.Second}">
            <TextBlock>2...</TextBlock>
        </DataTemplate>
        <DataTemplate x:Key="{x:Static local:View.Third}">
            <TextBlock>3...</TextBlock>
        </DataTemplate>
    </ContentControl.Resources>
    <ContentControl.Style>
        <Style TargetType="ContentControl">
            <Style.Triggers>
                <DataTrigger Binding="{Binding CurrentView}" Value="First">
                    <Setter Property="ContentTemplate" Value="{StaticResource {x:Static local:View.First}}" />
                </DataTrigger>
                <DataTrigger Binding="{Binding CurrentView}" Value="Second">
                    <Setter Property="ContentTemplate" Value="{StaticResource {x:Static local:View.Second}}" />
                </DataTrigger>
                <DataTrigger Binding="{Binding CurrentView}" Value="Third">
                    <Setter Property="ContentTemplate" Value="{StaticResource {x:Static local:View.Third}}" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ContentControl.Style>
</ContentControl>

显然,您可以在DataTemplates中用UserControls替换TextBlock元素。

票数 1
EN

Stack Overflow用户

发布于 2020-10-13 23:21:25

我不想创建3个单独的视图模型,因为视图3需要从视图中选择相应的视图

使用单个VM的一种方法是创建一个页面,其中导航(如按钮单击操作)只需根据绑定的状态变量隐藏/显示特定的控件即可完成。这意味着屏幕上所有控件的Visiblity都绑定到该绑定状态值;根据找到的值,一些控件是可见的,一些控件是隐藏的。

如果你有一个不太大的应用程序,可以通过关闭旧的项目和打开新的项目来隐藏和显示用户看到的新页面视图。

如果应用程序将有大约25个以上的控件需要这样的编排,请避免这种设计。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64336780

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档