0

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

在此列表视图中,第 3 列具有单元格模板。并且此列绑定到 DataTable 中的税收百分比列。此税收百分比列的类型为 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 中注释了多重绑定,但没有用。

可能是什么问题呢 ???

任何想法 ??

4

2 回答 2

0

Change your UpdateSourceTrigger to LostFocus in your TextBox binding, Currently you are triggering property change as soon as User starts typing, After triggering it on LostFocus your grid will be sorted as soon as it loses focus.

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

And if you need to sort it only by clicking the header change your Binding mode to OneWay like

<TextBox Name="txt1" Text="{Binding taxpercent, Mode=OneWay}"
于 2013-10-07T04:25:14.637 回答
0

像这样更改您的排序代码

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);
    }            
    }

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

感谢 Matthew Manela Defer 自动刷新

于 2013-10-07T05:23:42.693 回答