第一所有 - 對不起,我不是很熟悉VB.Net,所以我的代碼是用C#編寫的。由於我不瞭解你實際需要什麼,我只能給你提供一個不真正優雅的解決方案。
對於將您的ComboBox
綁定到數據庫中的項目,您需要使用StaticResource
,正如我所看到的那樣,但也許您將其定義爲錯誤,這就是爲什麼它不適用於您。爲了得到它的工作,你需要有一類這樣的:
public class artiklsList : List<artikl>
{
public artiklsList()
{
this.Add(new artikl(1, "first")); //this is dummy items, you need to do a database stuff here
this.Add(new artikl(2, "second"));
this.Add(new artikl(3, "third"));
}
}
而一個XAML這樣的:
<Window.Resources>
<my:artiklsList x:Key="source"></my:artiklsList>
</Window.Resources>
您還需要更新使細胞與文本當ComboBox
選擇改變。這不是一項簡單的任務,因爲使用Binding
對ElementName
進行控制的最簡單方法不適用於DataGrid
。我所做的是有點哈克反正...
因此,XAML是不是很複雜:
<DataGrid Name="dgrStavke" AutoGenerateColumns="False" Height="160" Width="600" HorizontalAlignment="Left" Margin="5" Grid.Row="7" Grid.ColumnSpan="4" >
<DataGrid.Columns>
<DataGridTemplateColumn Header="Artikl ID">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox SelectedIndex="{Binding selectedIndexID, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Name="cmbArtikli" Width="120" DisplayMemberPath="artiklId" ItemsSource="{StaticResource source}">
</ComboBox>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Header="Naziv artikla" Binding="{Binding nazivArtikla}"/>
</DataGrid.Columns>
</DataGrid>
的SelectedIndex
結合和可怕的代碼,這樣做背後的伎倆與更新文本單元。爲了使綁定工作正常,articl
類必須執行INotifyPropertyChanged
接口。
public class artikl: INotifyPropertyChanged
{
public artikl(int artid, string nazivart)
{
artiklId = artid;
nazivArtikla = nazivart;
}
public int artiklId{get;set;}
private string _nazv;
public string nazivArtikla
{
get { return _nazv; }
set { _nazv = value; NotifyPropertyChanged("nazivArtikla"); }
}
//Here I think you may have questions
private int _index;
public int selectedIndexID
{
get
{
//To get a SelectedIndex for ComboBox in current row we look in
//listArtikli defined in a MainWindow for a articli item with a current
//item's Id and take the index of this item
artikl art = MainWindow.listArtikli.Find(el => el.artiklId == this.artiklId);
return MainWindow.listArtikli.IndexOf(art);
}
set
{
//This property is binded with SelectedIndex property of ComboBox.
//When selected index changed, we look in listArtikli and take
//here properties of item with this index.
//This will change values of item binded to the current grid row
_index = value;
this.nazivArtikla = MainWindow.listArtikli[value].nazivArtikla;
this.artiklId = MainWindow.listArtikli[value].artiklId;
NotifyPropertyChanged("selectedIndexID");
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
和窗口隱藏代碼:
public partial class MainWindow : Window
{
public static artiklsList listArtikli = new artiklsList();
public static artiklsList gridsource = new artiklsList();
public MainWindow()
{
InitializeComponent();
dgrStavke.ItemsSource = gridsource;
}
}
你需要gridsource
除了listArtikli
與價值觀,以填補你DataGrid
。也因爲所有此代碼在selectedIndexID
如果您只使用listArtikli
其值損壞。因此listArtikli
包含articli
項目,它們按照檢索順序排序。並且gridsource
包含在DataGrid
中呈現的對artiklId
- nazivArtikla
。 希望它能幫助你一點點。
請發表您的代碼 – lena
嗨,lena,請讓我知道如何發佈代碼。 – dragy
不知道我是否完全明白你想做什麼。爲什麼你需要一個DataGrid?你希望行數等於表格行中的行數? – lena