【问题标题】:How to get my ViewModel instantiated如何让我的 ViewModel 实例化
【发布时间】:2015-01-31 09:13:52
【问题描述】:

我有一个可以运行的应用程序,现在我正在尝试使用适当的 MVVM 来完成它。据我从几个月的阅读中了解到,LinqToSQL 类(VS2013)是我的模型,它使用的 SQL Server 数据库也是如此。 UI 是视图,我正在实现一些 ObservableCollections 作为我的视图模型。这是 ViewModel:

    partial class MainViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    static DataClasses1DataContext _dataDc = new DataClasses1DataContext();
    ObservableDocuments _oDoc = new ObservableDocuments(_dataDc);

    public ObservableCollection<Document> oDoc
    {
        get
        {
            return _oDoc;
        }
    }

    public ICommand LoadData
    {
        get;
        private set;
    }

    protected void RaisePropertyChangedEvent(string propertyName)
    {
        var handler = PropertyChanged;
        if (handler != null)
            handler(this, new PropertyChangedEventArgs(propertyName));
    }
}

在工作版本中,DataContext 和 ObservableDocuments 行位于 MainWindow 代码中。 . .所以我已经移动了它们。这是 xaml:

<Window x:Class="LINQ_MVVM_1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:ViewModel="clr-namespace:LINQ_MVVM_1.ViewModel"
    Title="MainWindow" Height="350" Width="525">
<Grid>
    <DataGrid AutoGenerateColumns="False" HorizontalAlignment="Stretch" Margin="0,0,0,0" VerticalAlignment="Stretch"
                      DataContext="{Binding RelativeSource={RelativeSource AncestorType=Window}}"
                      ItemsSource="{Binding oDoc.View}">
        <DataGrid.Columns>
            <DataGridTextColumn x:Name="docIDColumn" Binding="{Binding DocId}" Header="ID" Width="65"/>
            <DataGridTextColumn x:Name="DocumentNumberColumn" Binding="{Binding Number}" Header="Document Number" Width="*"/>
            <DataGridTextColumn x:Name="altIDColumn" Binding="{Binding AltID}" Header="Alt" Width="55"/>
        </DataGrid.Columns>
    </DataGrid>
</Grid>

这里是绑定引用对象的代码,一个 ViewableCollection,带有一个可过滤的视图属性:

    public class ViewableCollection<T> : ObservableCollection<T>
{
    private ListCollectionView _View;
    public ListCollectionView View
    {
        get
        {
            if (_View == null)
            {
                _View = new ListCollectionView(this);
            }
            return _View;
        }
    }
}

class ObservableDocuments : ViewableCollection<Document>
{
    public ObservableDocuments(DataClasses1DataContext dataDc)
    {
        foreach (Document doc in dataDc.Documents)
        {
            this.Add(doc);
        }
    }
}

将 _dataDc 和 _oDoc 移动到 ViewModel 类中导致没有填充数据网格。我究竟做错了什么?似乎没有实例化 ViewModel。

【问题讨论】:

    标签: c# wpf linq xaml mvvm


    【解决方案1】:

    这一行:

    DataContext="{Binding RelativeSource={RelativeSource AncestorType=Window}}"
    

    意味着您仍在查看DataContext 的代码隐藏。如果您不知道,DataContext 定义了所有绑定在其“路径”开始处查看的根对象。

    所以你是对的,VM 没有被实例化,因为你从未实例化它

    相反,删除该行并在您的 UI 构造函数中写入:

    DataContext = new MainViewModel();
    

    当然还有其他方法,但这是最简单的。

    【讨论】:

    • @PaulGibson 太棒了!如果您对 DataContext 和绑定的工作方式有更多疑问,请前往 WPF 聊天室。我大部分时间都在那儿,如果你 ping 我,我一定会回复你。
    猜你喜欢
    • 1970-01-01
    • 2019-06-16
    • 1970-01-01
    • 1970-01-01
    • 2019-09-17
    • 1970-01-01
    • 2020-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多