【问题标题】:WPF, DataGrid, clicked item/row does not highlight (blue background)WPF、DataGrid、单击的项目/行不突出显示(蓝色背景)
【发布时间】: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。

标签: c# wpf linq datagrid


【解决方案1】:

以下是可行的解决方案:

private void tabControlOrganizer_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
   if (tabControlOrganizer.SelectedItem != null)
   {
      if (e.Source is TabControl)
      {
        if (tabItemTrades.IsSelected)
        {
          dataGridTrades.ItemsSource = Queries.GetTradeList(dataContext);
        }

SelectionChanged 是问题所在:In C# WPF, why is my TabControl's SelectionChanged event firing too often?

在空闲时间我会检查 MVVM 来解决这个问题,ty @Mark W。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-27
    • 2016-06-13
    • 2012-03-25
    • 1970-01-01
    • 2011-10-01
    • 2023-03-29
    • 1970-01-01
    • 2010-10-16
    相关资源
    最近更新 更多