- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的第一个 StackExchange 问题,如果我做错了什么,请告诉我。
我正在将旧的 winforms 代码转换为 WPF,并且一直在使用它们。我大部分时间都取得了成功,但我正在处理我的第一个涉及数据绑定(bind)的数据表。这似乎是最难转换的事情,因为绑定(bind)主要是在 xaml 而不是代码中处理的。
作为附加说明,它使用 CSLA,据我了解,它是类似于 MVVM 的代码结构(仍在学习这些是什么)。
通过一些试验,我设法创建了一个正常工作的数据网格,但我需要将其中一列实现为组合框。它目前表示为一个数字(1-10),但我需要与数字相关的描述,该描述位于数据库的不同表中。
在切换到组合框之前最初显示的数字是无资格原因。我希望这个值成为组合框中当前选定的项目。
无法发布图片,所以这是我展示数据库表结构的尝试:
模组评论
NERList.GetNameValueList();
<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>
using CslaFactoryBusinessObjects;
...
namespace WpfTestProject
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
WpfTestProject.caseviewDataSet caseviewDataSet = ((WpfTestProject.caseviewDataSet)(this.FindResource("caseviewDataSet")));
// Load data into the table modreview. You can modify this code as needed.
WpfTestProject.caseviewDataSetTableAdapters.modreviewTableAdapter caseviewDataSetmodreviewTableAdapter = new WpfTestProject.caseviewDataSetTableAdapters.modreviewTableAdapter();
caseviewDataSetmodreviewTableAdapter.Fill(caseviewDataSet.modreview);
System.Windows.Data.CollectionViewSource modreviewViewSource = ((CollectionViewSource)(this.FindResource("modreviewViewSource")));
modreviewViewSource.View.MoveCurrentToFirst();
noneligibilityreasonColumn.ItemsSource = NERList.GetNameValueList();
}
}
//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;
}
最佳答案
这里有很多有用的信息,也是 SO 问题的良好开端。
给定您的 XAML 绑定(bind):
<DataGridComboBoxColumn x:Name="noneligibilityreasonColumn" Width="SizeToHeader" Header="noneligibilityreason"
ItemsSource="{Binding Source={StaticResource noneligibilityViewSource}}"
SelectedValueBinding="{Binding noneligibilityreason}"
DisplayMemberPath="Value"
SelectedValuePath="Key"
/>
modreview
对象/行)组合框控件应该使用
noneligibilityViewSource
为其可选项目列表。
Window_Loaded
事件中项目来源的矛盾设置)。
DisplayMemberPath
中指定的“值”属性。 .这将对应于
ItemSource
指定的集合中的 item 的相同命名属性。 .
noneligibilityViewSource
,所以下一个问题是这个
noneligibilityViewSource
里面是什么?
<CollectionViewSource x:Key="noneligibilityViewSource" Source="{Binding noneligreason, Source={StaticResource caseviewDataSet}}" />
noneligibilityViewSource
)来自一个名为
noneligreason
的属性。在
caseviewDataSet
.鉴于 DataSets 的工作方式,我期待一个名为
noneligreason
的 DataTable或带有为此添加的属性的自定义数据集。很可能是前者。
Window_Loaded
中有矛盾的代码。以编程方式将组合框的 ItemSource 设置为其他内容的事件。具体到调用
NERList.GetNameValueList();
的结果.我说是矛盾的,因为 XAML 资源声明说这个非资格值列表来自 DataSet 上相应命名的属性,而事件中的代码说使用 CSLA 业务对象列表。
NERList.GetNameValueList();
来支付再次访问数据库的性能损失。因为你已经有了可用的数据。
noneligreason
caseviewDataSet
中的数据表或从调用
NERList.GetNameValueList();
返回的 CSLA 业务对象列表中- 只有这样,您才能知道 DisplayMemberPath 应该使用哪个属性以及 SelectedValuePath 应该使用哪个属性。
noneligreason
的 DataTable ,然后您需要从中找出属性的名称。例如,它可以是
noneligreasonid
和
noneligreasondesc
,但它可能是其他东西,具体取决于表适配器的功能。您的装订
DisplayMemberPath
那么可能是
noneligreasondesc
和你的
SelectedValuePath
那么可能是
noneligreasonid
.
NERList.GetNameValueList();
的调用然后,您需要确定返回的对象的属性名称是什么。根据命名约定,我猜它是“名称”和“值”,这意味着
DisplayMemberPath
应该是
Value
和
SelectedValuePath
应设置为
Name
.猜测是不好的,所以去看看那个对象,或者使用调试器来检查值。
SelectedValueBinding
属性是指
modreview
上的属性应该包含所选组合框项的值的行对象,特别是
SelectedValuePath
组合框项目的属性将应用于
SelectedValueBinding
modreview
上的属性(property)实例。
<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"
/>
关于c# - 使用单独的数据库表在 DataGridComboBoxColumn 中设置 ItemSource,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31482083/
您好,我正在使用 WPF DataGrid,并且正在尝试使 ComboBox Column 正常工作。 当我查看网
我正在 WPF 中用 C# 3.5 编写一个应用程序。我想以编程方式将 C# 中的 DataGridComboBoxColumn 添加到 WPF 工具包 DataGrid。问题是控件本身似乎不存在,因
我有一个包含 2 列的数据网格。一列包含角色信息,另一列应该有一个包含可用用户列表的组合框。组合框中的数据与第一列中的数据无关。 组合框没有数据上下文,只有一个项目源,而且我似乎也无法使用绑定(bin
我想知道如何让 DataGridComboBoxColumn 在不处于编辑模式时显示所选项目的文本?是否可以使编辑模式下的组合框最初显示所选项目的文本? 这是我的 XAML:
加载数据网格时是否可以“暴露”WPF 工具包数据网格的 DataGridComboBoxColumn?默认情况下,您必须单击单元格才能显示组合框。我希望用户看到组合框可用,而无需单击单元格。我希望组合
我在 DataGrid 中有一个 DataGridComboBoxColum。我希望能够单击单元格一次并下拉组合框。目前我必须点击多次。
我有一个带有 DatagridComboBoxColumn 的数据网格,我想在用户从 ComboBox 中选择任何东西时触发事件 SelectionChanged,执行一些操作,我该怎么做任何建议,谢
我有一个带有 DataGridComboBoxColumn 的网格,我正在尝试更改单元格的前景色(不处于编辑状态)。 我知道我可以使用 DataGridTemplateColumn 解决这个问题,但我
我在 WPF 和 DataGridComboBoxColumn 中使用 Datagrid。请在下面找到代码: ...
当我单击 DataGridComboBoxColumn 中的单元格时,组合框变得可见,我可以选择项目。当我选择了一个项目时,它在顶部可见。但是,当单元格又名 ComboBox 因为我单击 DataGr
我正在尝试数据绑定(bind) DataGridComboBoxColumn 我在这里做错了什么,因
我正在使用 C#、.NET Framework 4.5.1、MVVM Light 框架和 Entity Framework 6.1.3 开发 WPF。 我有这个DataGrid在一个窗口中:
我有一个 ViewModel(其结构的伪代码): class ViewModel { public List Packages { get; set; } } enum Type {
我有一个 DataGrid,里面有几个 ComboBox 列。使用 ViewModel 中的 IDataErrorInfo 接口(interface)验证这些值。将鼠标悬停在适当的单元格上时,工具提示
我正在尝试将 T 的 ObservableCollection 绑定(bind)到 DataGrid 的 DataGridComboBoxColumn。 DataGrid 定义是:
我目前正在努力使用 C# WPF 中的 DataGridComboBoxColumn。 我有 ToolModel 类 class ToolModel { public long Id { ge
我在 WPF 项目的 DataGrid 中有一个 DataGridComboBoxColumn 设置如下: 但是当我运行该项目时,该列仅显示空白值,并且编辑模式下的组合框执行相同的操作。 DataG
示例代码: class GameListViewModel { private IGameRepository repository; public GameViewModel Gam
我有一个数据网格,在 DataGrid.AutoGeneratingColumn 事件中,我将一些列更改为 DataGridComboBoxColumns。 与此同时,我还想向该新组合框添加一个选择更
我是 WPF 的新手,我遇到了以下情况: class Person{ string Name; List ListAddresses; } 我有一个带有 ItemsSource 的
我是一名优秀的程序员,十分优秀!