带有Caliburn.micro的MVVM-用可绑定的集合填充Datagrid控件

问题描述 投票:0回答:2

我正在尝试解决无法在数据网格中查看可绑定集合的死锁。这是我学习MVVM的一部分。 MVVM框架使用Caliburn Micro,并且在同一解决方案中,单独的类库项目使用Dapper连接到本地SQL数据库。 ShellView和ShellViewModel的代码粘贴在下面]

ShellView-XAML

<Window x:Class="WPFUI.Views.ShellView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WPFUI.Views"
        mc:Ignorable="d"
        Title="ShellView" Height="450" Width="800" Background="Red">
    <Grid>

        <StackPanel Orientation="Horizontal" Width="100" Height="50" VerticalAlignment="Top">
            <Button x:Name="LoadCHARecRatesList" Content="CHA Rec Rates"/>
        </StackPanel>
        <DataGrid ItemsSource="{Binding Path=LstCHARecModels, Mode=OneWay}" Margin="20,100,20,30" AutoGenerateColumns="True">

        </DataGrid>

    </Grid>
</Window>

ShellViewModel代码如下:

ShellViewModel

public class ShellViewModel : Conductor<object>
    {
        private BindableCollection<CHARecModel> _lstcharecmodels;

        public BindableCollection<CHARecModel> LstCHARecModels
        {
            get
            {return _lstcharecmodels;}

            set
            {
                _lstcharecmodels = value;
                NotifyOfPropertyChange(() => LstCHARecModels);
            }
        }

        public void LoadCHARecRatesList()
        {
            var data = LoadReviewRCRRatesTbl();
            _lstcharecmodels = new BindableCollection<CHARecModel>();

            foreach (var row in data)
            {
                _lstcharecmodels.Add(new CHARecModel
                {
                    TDate = row.TDate,
                    Vendor = row.Vendor,
                    Code=row.Code,
                    NameCode=row.NameCode,
                    Price = row.Price,
                    RCRStatus=row.RCRStatus,
                    NameCodeDate = row.NameCodeDate

                });


            }

        }

    }

ShellView上的按钮已连接至LoadCHARecRatesList方法(该方法位于另一个负责数据访问的类库中,并且此方法的输出填充可绑定集合LstCHARecModels),并且Datagrid已绑定到可绑定集合LstCHARecModels-可绑定集合正在通知属性更改。目的是当在UI上单击按钮时,它将从SQL数据库中获取数据并填充数据网格。我无法解决的问题是Datagrid保持空白。当我通过在LoadCHARecRatesList方法的最后一行放置换行符来运行代码时,我注意到在ShellViewModel中已正确填充了集合(LstCHARecModels)。当我将鼠标悬停在ShellView的以下行LstCHARecModels中的 <DataGrid ItemsSource="{Binding Path=LstCHARecModels, Mode=OneWay}" Margin="20,100,20,30" AutoGenerateColumns="True">上时,我注意到该集合已冒泡到Datagrid定义中(我可以看到所有元素,并且可以深入到每个元素中以查看其中的数据-我注意到它在元素计数以及每个元素的内容上都是准确的。但是即使在此之后,当我运行项目时,datagrid仍然totalally blank

其他尝试

在定义Datagrid时,我也尝试了``x:Name =“ LstCHARecModels”```徒劳无功。

我正在寻求有关如何获取可绑定集合以填充数据网格的帮助。本质上,它乞belief认为可以在调试模式下在数据网格的绑定中查看LstCHARecModels,但是即使非常接近,也不会填充数据网格!

wpf mvvm data-binding datagrid caliburn.micro
2个回答
0
投票

通过调用公共而非私有财产来更改代码:

    public void LoadCHARecRatesList()
    {
        var data = LoadReviewRCRRatesTbl();
        LstCHARecModels = new BindableCollection<CHARecModel>();

        foreach (var row in data)
        {
            LstCHARecModels.Add(new CHARecModel
            {
                TDate = row.TDate,
                Vendor = row.Vendor,
                Code=row.Code,
                NameCode=row.NameCode,
                Price = row.Price,
                RCRStatus=row.RCRStatus,
                NameCodeDate = row.NameCodeDate

            });

        }
    }

另一件事,您需要导体。.我不知道您使用的代码,但是屏幕就足够了...


0
投票

您应该初始化BindableCollection<CHARecModel> 一次,然后在您的方法中添加项目:

public class ShellViewModel : Conductor<object>
{
    private BindableCollection<CHARecModel> _lstcharecmodels = new BindableCollection<CHARecModel>();
    public BindableCollection<CHARecModel> LstCHARecModels
    {
        get { return _lstcharecmodels; }
    }

    public void LoadCHARecRatesList()
    {
        var data = LoadReviewRCRRatesTbl();
        foreach (var row in data)
        {
            _lstcharecmodels.Add(new CHARecModel
            {
                TDate = row.TDate,
                Vendor = row.Vendor,
                Code = row.Code,
                NameCode = row.NameCode,
                Price = row.Price,
                RCRStatus = row.RCRStatus,
                NameCodeDate = row.NameCodeDate

            });
        }
    }
}

如果每次调用该方法都创建一个新集合,则使用BindableCollection<T>是毫无意义的。

假设您在设置器中引发了PropertyChanged事件,但是如果设置了[[property而不是后备字段,它仍然可以工作:

public void LoadCHARecRatesList() { var data = LoadReviewRCRRatesTbl(); LstCHARecModels = new BindableCollection<CHARecModel>(); foreach (var row in data) { ... } }
© www.soinside.com 2019 - 2024. All rights reserved.