C# 使用单独的数据库表在DataGridComboxColumn中设置ItemSource
我的第一个问题,告诉我我做错了什么 我正在将旧的winforms代码转换为WPF,并在这一过程中学习它们。我大部分时间都很成功,但我正在处理第一个涉及数据绑定的数据表。这似乎是最难转换的,因为绑定主要是在xaml中处理的,而不是在代码中处理的 另外,它使用了CSLA,据我所知,CSLA是一种类似于MVVM的代码结构(仍在学习它们是什么) 通过一点实验,我成功地创建了一个功能正常的数据网格,但我需要将其中一列实现为组合框。它当前表示为一个数字(1-10),但我需要该数字的描述,该数字位于数据库的另一个表中。C# 使用单独的数据库表在DataGridComboxColumn中设置ItemSource,c#,wpf,xaml,combobox,csla,C#,Wpf,Xaml,Combobox,Csla,我的第一个问题,告诉我我做错了什么 我正在将旧的winforms代码转换为WPF,并在这一过程中学习它们。我大部分时间都很成功,但我正在处理第一个涉及数据绑定的数据表。这似乎是最难转换的,因为绑定主要是在xaml中处理的,而不是在代码中处理的 另外,它使用了CSLA,据我所知,CSLA是一种类似于MVVM的代码结构(仍在学习它们是什么) 通过一点实验,我成功地创建了一个功能正常的数据网格,但我需要将其中一列实现为组合框。它当前表示为一个数字(1-10),但我需要该数字的描述,该数字位于数据库的另
在将其切换到组合框之前最初显示的数字为非LigibilityReason。我希望此值是组合框中当前选定的项 无法发布图像,因此我尝试显示数据库表的结构: modreview
- 回顾
- 因特卡塞诺
- 新推荐
- 放映日期
- 合格的
- 非LigibilityReason(这是要制作成组合框的一个)
- 非宗教的
- 非宗教的
NERList.GetNameValueList();
至于ItemsSource,我需要所有的非ligReasonDesc值。当然,还有一个问题,就是让非宗教原因与非宗教原因相匹配。我发现,它似乎做了同样的事情,但没有数据库,而是使用类:
我试图复制它,因为我认为它应该在我的XAML中工作:
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfTestProject" x:Class="WpfTestProject.MainWindow"
Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded">
<Window.Resources>
<local:caseviewDataSet x:Key="caseviewDataSet"/>
<CollectionViewSource x:Key="modreviewViewSource"
Source="{Binding modreview, Source={StaticResource caseviewDataSet}}"/>
<CollectionViewSource x:Key="noneligibilityViewSource"
Source="{Binding noneligreason, Source={StaticResource caseviewDataSet}}"/>
</Window.Resources>
<Grid DataContext="{StaticResource modreviewViewSource}">
<Grid.RowDefinitions>
<RowDefinition/>
</Grid.RowDefinitions>
<DataGrid x:Name="modreviewDataGrid"
RowDetailsVisibilityMode="VisibleWhenSelected"
ItemsSource="{Binding}"
EnableRowVirtualization="True"
AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn x:Name="reviewnumColumn" Width="SizeToHeader" Header="reviewnum" Binding="{Binding reviewnum}"/>
<DataGridTextColumn x:Name="intcasenoColumn" Width="SizeToHeader" Header="intcaseno" Binding="{Binding intcaseno}"/>
<DataGridCheckBoxColumn x:Name="newreferralColumn" Width="SizeToHeader" Header="newreferral" Binding="{Binding newreferral}"/>
<DataGridTemplateColumn x:Name="screendateColumn" Width="Auto" Header="screendate">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<DatePicker SelectedDate="{Binding screendate, Mode=TwoWay, NotifyOnValidationError=true, ValidatesOnExceptions=true}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridCheckBoxColumn x:Name="eligibleColumn" Width="SizeToHeader" Header="eligible" Binding="{Binding eligible}"/>
<DataGridComboBoxColumn x:Name="noneligibilityreasonColumn" Width="SizeToHeader" Header="noneligibilityreason"
ItemsSource="{Binding Source={StaticResource noneligibilityViewSource}}"
SelectedValueBinding="{Binding noneligibilityreason}"
DisplayMemberPath="Value"
SelectedValuePath="Key"
/>
</DataGrid.Columns>
</DataGrid>
</Grid>
}
这段代码大部分是在我从数据源拖放时生成的,但代码后面的最后一行是我认为应该添加ItemsSource的地方。不确定它是否属于Loaded,但似乎在那里可以。也不确定是否有办法在XAML中实现这一点
我意识到我在XAML和代码中复制了设置ItemsSource,但两者都不能正常工作,所以我将两者都包括进来,以显示我尝试了哪些选项
最后,我想我应该展示我试图在WPF转换中模拟的旧winforms代码(不确定这是否足够)。我认为它使用一个隐藏的组合框来设置绑定,然后将其添加到表中:
//from Program.cs used in setupModRvwGrdHdr()
public static void ListControlBinding(ref UltraCombo comboBox, object lkupdataSource, string displayMember,
string valueMember, object objDataSource, string objProp) {
comboBox.DataSource = lkupdataSource;
comboBox.DisplayMember = displayMember;
if (!string.IsNullOrEmpty(valueMember))
comboBox.ValueMember = valueMember;
if (objDataSource != null)
comboBox.DataBindings.Add("Value", objDataSource, objProp);
}
//from the code for the specific winform
private void setupModRvwGrdHdr() {
cbNonEligReason.DataBindings.Clear();
grdModReviews.DataSource = bsModRvws;
Program.ListControlBinding(ref cbNonEligReason, NERList.GetNameValueList(), "Value", "Key", bsModRvws,
"NonEligibleReasonIDStr");
cbNonEligReason.DisplayLayout.Bands[0].Columns["Key"].Hidden = true;
cbNonEligReason.DisplayLayout.Bands[0].Columns["Value"].Header.Caption = "Noneligiblity Reason";
grdModReviews.DisplayLayout.Bands[0].Columns["reviewnum"].CellActivation = Activation.NoEdit;
grdModReviews.DisplayLayout.Bands[0].Columns["intcaseno"].Hidden = true;
grdModReviews.DisplayLayout.Bands[0].Columns["noneligibilityreason"].Hidden = true;
grdModReviews.DisplayLayout.Bands[0].Columns["screendate"].Hidden = false;
grdModReviews.DisplayLayout.Bands[0].Columns["screendate"].Header.Caption = "Date of Screen";
grdModReviews.DisplayLayout.Bands[0].Columns["screendate"].Width = 100;
grdModReviews.DisplayLayout.Bands[0].Columns["screendate"].EditorComponent = dteModRvwDate;
grdModReviews.DisplayLayout.Bands[0].Columns["eligible"].Hidden = false;
grdModReviews.DisplayLayout.Bands[0].Columns["eligible"].Header.Caption = "Eligible";
grdModReviews.DisplayLayout.Bands[0].Columns["eligible"].Width = 70;
grdModReviews.DisplayLayout.Bands[0].Columns["NonEligibleReasonIDStr"].Hidden = false;
grdModReviews.DisplayLayout.Bands[0].Columns["NonEligibleReasonIDStr"].Header.Caption =
"Reason for Noneligibility";
grdModReviews.DisplayLayout.Bands[0].Columns["NonEligibleReasonIDStr"].Width = 250;
grdModReviews.DisplayLayout.Bands[0].Columns["NonEligibleReasonIDStr"].EditorComponent = cbNonEligReason;
grdModReviews.DisplayLayout.Bands[0].Columns["NonEligibleReasonIDStr"].Nullable =
Infragistics.Win.UltraWinGrid.Nullable.Nothing;
}
这是一个相当大的程序,CslaFactoryBusinessObjects类中可能有一些有用的函数,但我认为我应该学习如何这样做,以便更好地理解WPF中的数据操作
我已经寻找解决方案好几天了,但还没有找到一个和我的情况足够相似的案例。我只是不确定每个绑定属性是如何工作的,以及它们在这种特定情况下是如何应用的。最后不得不认输,在这里做个交代。很抱歉这么长时间,但我想说得具体一点,表明我已经做了一段时间了
请帮忙 这里有很多有用的信息,这是一个很好的开始 考虑到您的XAML绑定:
<DataGridComboBoxColumn x:Name="noneligibilityreasonColumn" Width="SizeToHeader" Header="noneligibilityreason"
ItemsSource="{Binding Source={StaticResource noneligibilityViewSource}}"
SelectedValueBinding="{Binding noneligibilityreason}"
DisplayMemberPath="Value"
SelectedValuePath="Key"
/>
上面声明CollectionViewSource实例(也称为noneligibilityViewSource
)来自caseviewDataSet
上名为noneligreason
的属性。考虑到数据集的工作方式,我希望要么是一个名为noneligreason
的数据表,要么是一个带有附加属性的定制数据集。很可能是前者
现在,在窗口\u Loaded
事件中,您的代码相互矛盾,该事件通过编程方式将combobox的ItemSource设置为其他内容。特别是调用NERList.GetNameValueList()的结果代码>。我之所以说这是矛盾的,是因为XAML资源声明说这个非灵巧性值列表来自数据集上相应命名的属性,而事件中的代码说使用CSLA业务对象列表
你得弄清楚你想/应该用哪一种
PS:很可能,如果DataSet中的noneligibility属性包含数据,则无需通过调用NERList.GetNameValueList()再次访问数据库的性能损失代码>因为您已经有可用的数据
一旦确定哪个“源”包含组合框的项目列表,即caseviewDataSet
中的noneligreason
数据表或调用NERList.GetNameValueList()返回的CSLA业务对象列表代码>-只有这样,您才能知道DisplayMemberPath应该使用哪个属性,SelectedValuePath应该使用哪个属性
因此,如果组合框的ItemSource与声明的XAML一致,并且caseviewDataSet有另一个名为noneligreason
的数据表,那么您需要从中找出属性的名称。例如,它可以是noneligreasonid
和noneligreasondesc
,但也可以是其他内容,具体取决于表适配器的功能。您的绑定的DisplayMemberPath
可以是noneligreasondesc
,您的SelectedValuePath
可以是noneligreasonid
如果组合框的ItemSource应该来自对NERList.GetNameValueList()的调用代码>然后,您需要再次确定返回的对象的属性名称。根据命名约定,我猜测它是“Name”和“Value”,这意味着DisplayMemberPath
应该是Value
,而SelectedValuePath
应该设置为Nam
<DataGridComboBoxColumn x:Name="noneligibilityreasonColumn" Width="SizeToHeader" Header="noneligibilityreason"
ItemsSource="{Binding Source={StaticResource noneligibilityViewSource}}"
SelectedValueBinding="{Binding noneligibilityreason}"
DisplayMemberPath="Value"
SelectedValuePath="Key"
/>
<CollectionViewSource x:Key="noneligibilityViewSource" Source="{Binding noneligreason, Source={StaticResource caseviewDataSet}}" />
<DataGridComboBoxColumn x:Name="noneligibilityreasonColumn" Width="SizeToHeader" Header="noneligibilityreason"
ItemsSource="{Binding Source={StaticResource noneligibilityViewSource}}"
SelectedValueBinding="{Binding noneligibilityreason}"
DisplayMemberPath="noneligreasondesc"
SelectedValuePath="noneligreasonid"
/>
<DataGridComboBoxColumn x:Name="noneligibilityreasonColumn" Width="SizeToHeader" Header="noneligibilityreason"
ItemsSource="{Binding Source={StaticResource noneligibilityViewSource}}"
SelectedValueBinding="{Binding noneligibilityreason}"
DisplayMemberPath="Value"
SelectedValuePath="Name"
/>