我正在使用 C# WPF
我有一個由名為“ALLTASKLIST”的可觀察集合填充的Datagrid,其中填充了從資料庫中選擇資料
我使用 DataBdinging 在我的 DataGrid 中顯示來自“ALLTASKLIST”的資料
但它是空的!
XAML:<DataGrid.Columns>
<DataGridComboBoxColumn Header="CMB">
<DataGridComboBoxColumn.EditingElementStyle>
<Style TargetType="ComboBox">
<Setter Property="ItemsSource" Value="{Binding Path=ALLTASKLIST}" />
<Setter Property="DisplayMemberPath" Value="NAMES" />
<Setter Property="SelectedValuePath" Value="CODE" />
</Style>
</DataGridComboBoxColumn.EditingElementStyle>
</DataGridComboBoxColumn>
</DataGrid.Columns>
</DataGrid>
后面的代碼:
public partial class MainWindow : Window
{
NEGIN1401Entities dbms = null;
public class ThePart1 : INotifyPropertyChanged
{
private int? _CODE;
private string _NAMES;
private int? _KIND;
private int? _idd;
public int? CODE
{
get { return _CODE; }
set
{
_CODE = value;
OnPropertyChanged("CODE");
}
}
public string NAMES
{
get { return _NAMES; }
set
{
_NAMES = value;
OnPropertyChanged("NAMES");
}
}
public int? KIND
{
get { return _KIND; }
set
{
_KIND = value;
OnPropertyChanged("KIND");
}
}
public int? idd
{
get { return _idd; }
set
{
_idd = value;
OnPropertyChanged("idd");
}
}
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(string strCaller = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(strCaller));
}
}
//public ObservableCollection<ThePart1> ALLTASKLIST { get; set; }
public ObservableCollection<ThePart1> ALLTASKLIST = new ObservableCollection<ThePart1>();
public MainWindow()
{
InitializeComponent();
DataContext = this;
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
dbms = new NEGIN1401Entities(Publications.TheENTTConnectionString);
ALLTASKLIST = dbms.Database.SqlQuery<ThePart1>("SELECT * FROM TCOD_ANBAR").ToObservableCollection();
var IsHaveItems = ALLTASKLIST.Count;//it will be 6 Items
//MainDatagrid.ItemsSource = ALLTASKLIST;
}
}
資料網格的專案: 在此處輸入影像描述
結果: 在此處輸入影像描述
uj5u.com熱心網友回復:
- 系結路徑需要一個屬性,而不是一個欄位。
- 您的樣式將在行級別為 ComboBox 設定值,并且資料背景關系將是集合元素 ThePart1,而不是 MainWindow。因此,系結路徑將相對于沒有 ALLTASKLIST 屬性的 ThePart1 進行解釋。
- DataGridComboBoxColumn 的一個特點是在創建DataGrid 時立即獲取源。因此,通常在 App 資源或靜態屬性中創建源。
試試這個例子:
public static ObservableCollection<ThePart1> ALLTASKLIST {get;}
= new ObservableCollection<ThePart1>();
ALLTASKLIST.Clear();
for(var tp1 in dbms.Database.SqlQuery<ThePart1>("SELECT * FROM TCOD_ANBAR").ToList())
ALLTASKLIST.Add(tp1);
<DataGridComboBoxColumn Header="CMB"
ItemsSource="{x:Static local:MainWindow.ALLTASKLIST}">
我不明白你的第二點,你能說得清楚一點嗎?
為了理解,請嘗試添加此列:
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding}"/>
</DataGrid.Columns>
非常感謝,但只有一件事還不行!它是組合框!無法在 DataGridTemplateColumn 中訪問它或為 CombobBox 列系結
沒有看到您的代碼,我無法說出問題的原因。
我做了一個簡單的例子來演示創建和系結 ComboBox 列的不同方法。考慮這個例子。也許你會發現一些對你有用的東西,你自己就會明白錯誤的原因是什么。
using System;
using System.Collections.ObjectModel;
using System.Windows;
namespace Core2022.SO.DataGridComboBoxColumnExample
{
public partial class ExampleWindow : Window
{
public ExampleWindow()
{
InitializeComponent();
}
private void OnLoaded(object sender, RoutedEventArgs e)
{
EntitiesViewModel vm = (EntitiesViewModel)DataContext;
Random random = new();
for (int i = 0; i < 10; i )
{
int num = random.Next();
vm.Entities.Add(new IdEntity { Id = num });
vm.Ids.Add(num);
EntitiesViewModel.StaticIds.Add(num);
}
}
}
public class EntitiesViewModel
{
public ObservableCollection<int> Ids { get; } = new();
public static ObservableCollection<int> StaticIds { get; } = new();
public ObservableCollection<IdEntity> Entities { get; } = new();
}
public class IdEntity
{
public int Id { get; set; }
}
}
<Window x:Class="Core2022.SO.DataGridComboBoxColumnExample.ExampleWindow"
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:Core2022.SO.DataGridComboBoxColumnExample"
mc:Ignorable="d"
Title="ExampleWindow" Height="450" Width="800"
Loaded="OnLoaded">
<FrameworkElement.DataContext>
<local:EntitiesViewModel/>
</FrameworkElement.DataContext>
<Grid>
<DataGrid ItemsSource="{Binding Entities}">
<DataGrid.Columns>
<DataGridComboBoxColumn SelectedItemBinding="{Binding Id, UpdateSourceTrigger=PropertyChanged}" ItemsSource="{x:Static local:EntitiesViewModel.StaticIds}"/>
<DataGridComboBoxColumn SelectedItemBinding="{Binding Id, UpdateSourceTrigger=PropertyChanged}" ItemsSource="{Binding DataContext.Ids, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}"/>
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox SelectedItem="{Binding Id, UpdateSourceTrigger=PropertyChanged}" ItemsSource="{x:Static local:EntitiesViewModel.StaticIds}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox SelectedItem="{Binding Id, UpdateSourceTrigger=PropertyChanged}" ItemsSource="{Binding DataContext.Ids, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</Grid>
</Window>
請注意第二列 - 它不是由于系結錯誤而創建的。這正是我在第 3 點中所寫的。
uj5u.com熱心網友回復:
首先,您應該系結到屬性,而不是欄位。更改
public ObservableCollection<ThePart1> ALLTASKLIST = new ObservableCollection<ThePart1>();
對此
public ObservableCollection<ThePart1> ALLTASKLIST { get; set; }
我認為您對 DataGrid 有疑問DataContext
。嘗試通過在 XAML 中創建 MainWindow 的本地實體,直接在 XAML 中將其設定為 DataGrid。(請參閱EldHasp的問題)
另外,嘗試將UpdateSourceTrigger
屬性設定為,PropertyChanged
因為列可能已更新,但您不能簡單地看到沒有焦點的更新。將DataGrid
的AutoGenerateColumns
屬性設定為false
,因此它不會創建新列。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/506337.html