【问题标题】:Change view lose data - wpf更改视图丢失数据 - wpf
【发布时间】:2018-10-09 18:40:57
【问题描述】:

您好,我正在尝试开发 Datalogger,因此我创建了一个菜单来切换选项,我决定使用 DataTemplates 和不同的 ViewModel。 Menu

XAML:

<Window.Resources>
    <DataTemplate x:Name="GraficoVtemplate" DataType="{x:Type viewmodels:GraficoVM}">
        <view:GraficoV DataContext="{Binding}" />
    </DataTemplate>

    <DataTemplate x:Name="ListaVtemplate" DataType="{x:Type viewmodels:ListaVM}">
        <view:ListaV DataContext="{Binding }"/>
    </DataTemplate>
<ContentControl Grid.Row="1" Grid.Column="1" Grid.ColumnSpan="4" Grid.RowSpan="5" Content="{Binding}"/>

这就是我更改数据上下文的方式;

XAML.CS

private void Novoteste_btn_Click(object sender, RoutedEventArgs e)
    {
        DataContext = new NovoTesteVM();
    }

    private void Lista_btn_Click(object sender, RoutedEventArgs e)
    {
        DataContext = new ListaVM();
    }

这是我拥有的文件,模型是空的,viewsmodals 有一些控件。Files

问题是当我更改菜单时,上一个菜单的内容没有保存,即当我选择菜单“lista”并填写一个数据网格时,当我再次选择时转到另一个菜单菜单“lista”数据丢失。我不知道我需要添加什么,或更改以使数据不丢失

谢谢你的解释!

编辑 1:

MainWindows.xaml.cs

private void Novoteste_btn_Click(object sender, RoutedEventArgs e)
    {
        DataContext = NovoTesteVM.NovoTesteViewModel;            
    }


    private void Grafico_btn_Click(object sender, RoutedEventArgs e)
    {
        DataContext = GraficoVM.Grafico;
    }

NovoTesteVM.cs

 public class NovoTesteVM
{

    private static NovoTesteVM novoTesteViewModel;
    public static NovoTesteVM NovoTesteViewModel
    {
        get
        {                
           novoTesteViewModel = novoTesteViewModel ?? new NovoTesteVM();

            return novoTesteViewModel;
        }

    }
}

【问题讨论】:

    标签: c# wpf view viewmodel


    【解决方案1】:

    创建容器属性以保留相应视图的 wiewmodel。它正在丢失数据,因为您在单击时正在初始化新对象。

    示例代码 -

        private NovoTesteVM novoTesteViewModel;
        public NovoTesteVM NovoTesteViewModel
        {
            get
            {
                novoTesteViewModel = novoTesteViewModel ?? new NovoTesteViewModel();
                return novoTesteViewModel;
            }
    
        }
    

    【讨论】:

    • 我想我意识到,我添加到 NovotesteVm 的示例代码,当我点击时只调用 NovoTesteVM() 吗?
    • 代替new NovoTesteVM();,执行`DataContext = NovoTesteViewModel;`。在使用它之前,你需要在类中有这个属性。
    • 我已经进行了更改,但数据丢失了。我还需要做什么?
    猜你喜欢
    • 1970-01-01
    • 2020-03-02
    • 1970-01-01
    • 2017-01-11
    • 2019-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-25
    相关资源
    最近更新 更多