我想知道如何做到這一點。 我有一個DataGridTemplateColumn
與簡單的ComboBox
控制裏面。 組合框有一個鏈接到它的SelectionChanged
事件。WPF - 獲取DataGridTemplateColumn中Combobox控件的行索引
在已更改的事件中,我想知道已更改的行的行索引是從已更改的組合框派生出來的。
我是否採取了錯誤的做法? 這是我有:
<DataGrid AutoGenerateColumns="False" Margin="5,10,5,5"
x:Name="dgrMatches" ItemsSource="{Binding .}"
CanUserAddRows="False" CanUserDeleteRows="False" CanUserReorderColumns="False" CanUserSortColumns="False"
SelectionMode="Single" SelectionUnit="FullRow" IsReadOnly="False"
RowStyle="{DynamicResource EditableRows}" CellStyle="{DynamicResource EditableTableCells}">
<DataGrid.Columns>
<DataGridTextColumn ... />
<DataGridTemplateColumn Header="Legs won" Width="Auto">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox Name="cbbLegsWonA"
SelectedIndex="{Binding LegsWonA, Mode=TwoWay}"
ItemsSource="{Binding NumberOfLegs}"
SelectionChanged="cbbLegsWonA_SelectionChanged" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<!-- @Chris Eelmaa -->
<DataGridTemplateColumn Header="Legs won" Width="Auto">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox Name="cbbLegsWonB"
SelectedIndex="{Binding LegsWonB, Mode=TwoWay}"
ItemsSource="{Binding NumberOfLegs}"
SelectionChanged="cbbLegsWonB_SelectionChanged" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn ... />
</DataGrid.Columns>
</DataGrid>
且事件處理程序:
private void cbbLegsWonA_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
ComboBox cbbLegsA = e.Source as ComboBox; // Altered combobox
int rowIndex = -1;
if (cbbLegsA.Tag == null)
{
DataGridRow row = (DataGridRow)dgrMatches.ContainerFromElement(cbbLegsA);
rowIndex = row.GetIndex();
cbbLegsA.Tag = rowIndex;
}
else
{
Int32.TryParse(cbbLegsA.Tag.ToString(), out rowIndex);
}
//@ChrisEelmaa: Basically, change the bound list and refresh the items in the datagrid
//The debugger doesn't get to this point, ofcourse
SingleMatch match = matches.ElementAt(rowIndex); // Get the current match out of the bound list
match.LegsWonA = cbbLegsA.SelectedIndex; // Manually change second combobox item
dgrMatches.Items.Refresh();
...
}
這不起作用:(DataGridRow)dgrMatches.ContainerFromElement(cbbLegsA) == null
取決於你如何定義「wroong方法」。這當然不是一種與WPF緊密相關的MVVM方法。重構所有使用MVVM模式的內容,並解釋爲什麼您首先需要這些信息,然後我可以提供一些提示。 –
我省略了一些細節,這是真的。我不太確定MVVM的真正含義。但是我有兩個'DataGridTemplateColumn',它的組合框與問題中的類似。當第一個組合框發生變化時,我想更改第二個組合框的值,反之亦然。這就是爲什麼我需要行索引,所以我可以通過直接更改數據網格中的值來更改第二個組合框。 – DerpyNerd
@ChrisEelmaa我更新了datagrid給你一個想法 – DerpyNerd