使用 MVVM(WPF、ListView、绑定)的 ListView DataBindig

ListView DataBindig using MVVM (WPF, ListView, Binding)

我有一个名为 ListViewModel 的模型,使用一种方法:

namespace LayoutMVVM.ViewModels
{
    public class ListViewModel
    {
        public void getData()
        {
        testViewClassDataContext tv = new testViewClassDataContext();
        List<test_view> tvq = (from tt in tv.test_views
                               select tt).ToList();
        }
    }
}

进入我的名为 ListView 的用户控件,我想从模型中获取结果并绑定到列表:

ListView.xaml:

<UserControl .....>    
    <Grid Background="Crimson">

        <ListView Width="230" Height="250"  Name="lvMyList">
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="FirstName" Width="90" DisplayMemberBinding="{Binding FirstName}" />
                    <GridViewColumn Header="LastName" Width="90" DisplayMemberBinding="{Binding LastName}" />
                    <GridViewColumn Header="Type" Width="50" DisplayMemberBinding="{Binding Type}" />
                </GridView>
            </ListView.View>
        </ListView>

    </Grid>
</UserControl>

ListView.cs

namespace LayoutMVVM.Views
{
    public partial class ListView : UserControl
    {
        public ListView()
        {
            InitializeComponent();

            ListViewModel lvm = new ListViewModel();
            lvMyList.ItemsSource = lvm.getData(); //error 
        }
    }
}

我刚开始使用 WPF,不知道如何正确绑定数据。

可能您应该按如下方式更改方法,以便该方法将 return 实际结果,

public List<test_view> getData()
    {
        testViewClassDataContext tv = new testViewClassDataContext();
        List<test_view> tvq = (from tt in tv.test_views
                               select tt).ToList();
        return tvq;
    }

Sajeetharan 的回答看起来不错,但如果您想继续使用 MVVM,请像这样替换代码背后的代码:

namespace LayoutMVVM.Views
{
    public partial class ListView : UserControl
    {
        public ListView()
        {
            InitializeComponent();
            ListViewModel lvm = new ListViewModel();
            this.DataContext = lvm; //this is what you are missing                
        }
    }
}

并像这样在 XAML 中分配 ListView 的 ItemsSouce:

        <ListView Width="230" Height="250"  Name="lvMyList" ItemsSource="{Binding tvq}" >
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="FirstName" Width="90" DisplayMemberBinding="{Binding FirstName}" />
                    <GridViewColumn Header="LastName" Width="90" DisplayMemberBinding="{Binding LastName}" />
                    <GridViewColumn Header="Type" Width="50" DisplayMemberBinding="{Binding Type}" />
                </GridView>
            </ListView.View>
        </ListView>

您将必须创建一个列表 属性 List(或 ObservableCollection)"tvq" 并通过在 ViewModel 中调用 getData() 来填充它。

我建议您阅读有关 MVVM 和绑定的更多信息。编码愉快!!

我添加此回复是为了整合之前回复中提到的内容:

首先按照 Sajeetharan 告诉您的那样更改 getData 方法:

public List<test_view> getData()
    {
        testViewClassDataContext tv = new testViewClassDataContext();
        List<test_view> tvq = (from tt in tv.test_views
                               select tt).ToList();
        return tvq;
    }

第二件事是按照 Naresh Ravlani 告诉您的那样更改代码:

public partial class ListView : UserControl
    {
        public ListView()
        {
            InitializeComponent();
            ListViewModel lvm = new ListViewModel();
            this.DataContext = lvm; //this is what you are missing                
        }
    }

第三个注意,你也告诉你的视图列表有一个项目源的等价物:

        <ListView Width="230" Height="250"  Name="lvMyList" ItemsSource="{Binding}" >
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="FirstName" Width="90" DisplayMemberBinding="{Binding FirstName}" />
                    <GridViewColumn Header="LastName" Width="90" DisplayMemberBinding="{Binding LastName}" />
                    <GridViewColumn Header="Type" Width="50" DisplayMemberBinding="{Binding Type}" />
                </GridView>
            </ListView.View>
        </ListView>

看看这个:

<ListView Width="230" Height="250"  Name="lvMyList" ItemsSource="{Binding}" >

请注意,您必须告诉列表视图使用 DataBinding 从 Datacontext 获取其项目源(ItemSource = "{Binding}")。

希望对您有所帮助!