【发布时间】:2015-08-31 07:02:44
【问题描述】:
这是 DataGrid XAML:
<DataGrid CanUserAddRows="False" AutoGenerateColumns="False" Height="501" HorizontalAlignment="Left" Margin="6,6,0,0" Name="dataGridTrades" VerticalAlignment="Top" Width="574" SelectionChanged="dataGridTrades_SelectionChanged">
<DataGrid.Columns>
<DataGridTextColumn Header="ID" Binding="{Binding TradeID}" IsReadOnly="true"/>
<DataGridTextColumn Header="Account" Binding="{Binding AccountName}" IsReadOnly="true"/>
<DataGridTextColumn Header="Card Name" Binding="{Binding CardName}" IsReadOnly="true"/>
<DataGridTextColumn Header="Set" Binding="{Binding SetMark}" IsReadOnly="true"/>
<DataGridTextColumn Header="Count" Binding="{Binding TradeCount}" IsReadOnly="true"/>
<DataGridTextColumn Header="Trade Date" Binding="{Binding TradeDate}" IsReadOnly="true"/>
<DataGridTextColumn Header="Tradepoint Name" Binding="{Binding TradepointName}" IsReadOnly="true"/>
<DataGridTextColumn Header="Price" Binding="{Binding Price}" IsReadOnly="true" Width="*"/>
</DataGrid.Columns>
</DataGrid>
这是一个填充它的查询:
public static List<RowTrade> GetTradeList(DataContext dataContext)
{
return (from trade in dataContext.Trades
join account in dataContext.Accounts on trade.accountID equals account.accountID
join tradePoint in dataContext.TradePoints on trade.tradePointID equals tradePoint.tradePointID
join card in dataContext.Cards on trade.cardID equals card.cardID
join set in dataContext.Sets on card.setID equals set.setID
select new RowTrade(
trade.tradeID,
account.accountName,
card.cardName,
set.setMark,
trade.tradeCount,
trade.tradeDate.ToString(),
tradePoint.tradePointName,
(double)trade.cardPrice)).ToList();
}
我在这里填充它:
private void tabControlOrganizer_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (tabControlOrganizer.SelectedItem != null)
{
if (tabControlOrganizer.SelectedItem == tabItemTrades)
{
dataGridTrades.ItemsSource = Queries.GetTradeList(dataContext);
}
当我点击行时,它不会突出显示。我添加了 2 个事件来检查此行为:
private void dataGridTrades_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (dataGridTrades.SelectedItem != null)
{
listBoxMessage.Items.Add(((RowTrade)dataGridTrades.SelectedItem).TradeID);
}
}
private void button1_Click(object sender, RoutedEventArgs e)
{
if (dataGridTrades.SelectedItem != null)
{
listBoxMessage.Items.Add(((RowTrade)dataGridTrades.SelectedItem).TradeID);
}
}
当我单击(更改选择)时,我可以在 listBox 上打印值。所以选定的行不为空。但是dataGrid松开高亮后,它变成了null(点击按钮后无法打印)。
如何解决?我需要突出显示此 SelectedItem。我有更多的 dataGrids 并且都表现正常。
【问题讨论】:
-
这看起来很不符合 MVVM。你在这个应用程序中关注 MVVM 吗?如果不是这样,你就会给自己制造很多麻烦,并且会发现自己经常与框架作斗争。
-
我不是,这是这个应用程序的最后一个标签页,我现在不想学习 MVVM,我宁愿尽快完成它,继续做其他事情。但是在等待解决方案时,我会检查 MVVM 是什么。你说得对,这看起来像是在打架。
-
我之所以提到它是因为,我也一直在学习 WPF,并且在 WPF 聊天中闲逛。我采用了标准的 WinForm 类型方法(看起来就像您所做的那样)并且经常遇到问题。切换到 MVVM 后,我不仅能够更快地获得帮助,而且总体上我遇到的问题也更少。
-
我并不固执,但现在我无法使用 MVVM 来解决这个问题。
-
当我将
dataGridTrades.ItemsSource = Queries.GetTradeList(dataContext);移动到public MainWindow(){}时,它可以工作。我从if (tabControlOrganizer.SelectedItem == tabItemTrades) {}中删除了填充,为什么会有差异?如何处理 tabItem 选择更改?我仍然想在这个 IF 中填充 dataGrid。