我正在尝试解决无法在数据网格中查看可绑定集合的死锁。这是我学习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
,但是即使非常接近,也不会填充数据网格!
通过调用公共而非私有财产来更改代码:
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
});
}
}
另一件事,您需要导体。.我不知道您使用的代码,但是屏幕就足够了...
您应该初始化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)
{
...
}
}