单元格模板化文本框的 WPF 列表视图排序问题

本文关键字:列表 WPF 视图 排序 问题 文本 单元格 | 更新日期: 2023-09-27 18:34:05

WPF Listview 有问题。此列表视图绑定到数据库中的数据表。这里没有 MVVM。一切都在代码隐藏中。

在此列表视图中,第 3 列具有单元格模板。并且此列绑定到数据表中的税收百分比列。此税百分比列的类型为 varchar [这基于其他一些业务逻辑,因此无法更改数据类型]。

 <GridViewColumn.CellTemplate>
   <DataTemplate>
      <TextBox Name="txt1" Text="{Binding taxpercent, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
               PreviewTextInput="txt1_PreviewTextInput" Width="105">
               <TextBox.BorderBrush>
                    <MultiBinding Converter="{StaticResource textComparer}">
                         <Binding Path="taxpercent" Mode="TwoWay" />
                         <Binding Path="taxpercent_val" Mode="TwoWay"/>
                    </MultiBinding>
               </TextBox.BorderBrush>
      </TextBox>                                        
   </DataTemplate>

加载列表视图时,它会填充数据库中的数据。假设列表视图中有 4 行数据。下面显示了"税"列。

Tax Percentage
--------------
2
1
4
3

在此之后,我编辑了税收百分比并单击 GridViewHeaderColumn 对其进行排序。它排序正确。现在排序顺序正在发送。下面是用于排序的代码。

    ICollectionView dataView = CollectionViewSource.GetDefaultView(lvTax.ItemsSource);
        if (dataView != null)
        {              
            dataView.SortDescriptions.Clear();
            SortDescription sd = new SortDescription("taxpercent", direction);
            dataView.SortDescriptions.Add(sd);
            dataView.Refresh();               
        }

第一次排序后,当我编辑或更改税百分比文本框中的值时,键入第一个数字后不久,它会自动再次排序!!表示编辑的行向下或向上取决于最后排序的方向!!

上面的事件处理程序"txt1_PreviewTextInput"只是为了使其成为数字文本框。我评论了上面的处理程序并尝试了。但是没有用。我在 XAML 中评论了多重绑定,但没有用。

可能是什么问题???

知道吗??

单元格模板化文本框的 WPF 列表视图排序问题

文本框绑定中将 UpdateSourceTrigger 更改为 LostFocus,目前,一旦用户开始键入,就会触发属性更改,在 LostFocus 上触发它后,您的网格将在失去焦点后立即排序。

<TextBox Name="txt1" Text="{Binding taxpercent, Mode=TwoWay, UpdateSourceTrigger=LostFocus}"

如果您只需要通过单击标题对其进行排序,请将绑定模式更改为 OneWay 例如

<TextBox Name="txt1" Text="{Binding taxpercent, Mode=OneWay}"

像这样更改排序代码

ICollectionView dataView = CollectionViewSource.GetDefaultView(lvTax.ItemsSource);
    if (dataView != null)
    {     
    using (dataView.DeferRefresh())
    {        
        dataView.SortDescriptions.Clear();
        SortDescription sd = new SortDescription("taxpercent", direction);
        dataView.SortDescriptions.Add(sd);
    }            
    }

这可能会阻止数据网格每次自动刷新

感谢马修·马内拉延迟自动刷新