查看下面的代码
Visual Studio 2010
列表框上方有一个文本框。
选中某个项目时,通过绑定TextBox可以变大或变小。
这会导致ListBox移动。
当ListBox移动选定的项目不是被点击的项目。
所选项目是移动列表框上的鼠标下的项目。
有时它甚至不会选择(尝试从9到10或从10到9)。
在此代码中重现问题的奇偶产生不同的长度。
所以,如果你从奇数到奇数甚至到没有问题。
如果你从奇数顶部到底部(没有滚动),那么有时会选择一个甚至不在视图中的项目。
在实际代码中,文本框是对项目的描述,描述的长度也不相同。
有趣的是在调试和get {return boundText; }然后它会选择适当的项目。
我认为它处理选择,然后衡量用户界面,然后在新的用户界面上再次处理选择。
由于它在调试中表现不同,所以很难弄清楚。列表框未选择所选项目
<Window x:Class="ListBoxMissClick.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525"
DataContext="{Binding RelativeSource={RelativeSource Self}}">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<TextBox Grid.Row="0" Grid.Column="0" Text="{Binding Path=BoundText}" TextWrapping="Wrap" />
<ListBox Grid.Row="1" Grid.Column="0" ItemsSource="{Binding Path=BoundList}" SelectedItem="{Binding Path=BoundListSelected, Mode=TwoWay}"/>
</Grid>
</Window>
using System.ComponentModel;
namespace ListBoxMissClick
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window, INotifyPropertyChanged
{
private string boundListSelected;
private string boundText = string.Empty;
private List<string> boundList = new List<string>();
private bool shortLong = true;
public event PropertyChangedEventHandler PropertyChanged;
protected void NotifyPropertyChanged(String info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
public MainWindow()
{
for (int i = 0; i < 1000; i++)
{
boundList.Add(i.ToString());
}
InitializeComponent();
}
public string BoundText
{
get { return boundText; }
set
{
if (boundText != value)
{
boundText = value;
NotifyPropertyChanged("BoundText");
}
}
}
public List<string> BoundList { get { return boundList; } }
public string BoundListSelected
{
get { return boundListSelected; }
set
{
boundListSelected = value;
if (Int32.Parse(value) % 2 == 0)
{
BoundText = value.ToString() + " something very long something very long something very long something very long something very long something very long something very long something very long something very long something very longsomething very long something very long something very long something very long something very longsomething very long something very long something very long something very long something very longsomething very long something very long something very long something very long something very longsomething very long something very long something very long something very long something very long";
}
else
{
BoundText = value.ToString() + " something short ";
}
}
}
private void ListBox_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
BoundText = " something very long something very long something very long something very long something very long something very long something very long something very long something very long something very longsomething very long something very long something very long something very long something very longsomething very long something very long something very long something very long something very longsomething very long something very long something very long something very long something very longsomething very long something very long something very long something very long something very long";
}
}
}
除了接受的答案Mouse.Capture和ReleaseMouseCapture的工作。
set
{
Mouse.Capture(this);
{
boundListSelected = value;
if (Int32.Parse(value) % 2 == 0)
{
BoundText = value.ToString() + " something very long something very long something very long something very long something very long something very long something very long something very long something very long something very longsomething very long something very long something very long something very long something very longsomething very long something very long something very long something very long something very longsomething very long something very long something very long something very long something very longsomething very long something very long something very long something very long something very long";
}
else
{
BoundText = value.ToString() + " something short ";
}
}
ReleaseMouseCapture();
}
呵呵,是的,如果你只是把鼠标放下,它真的很有趣。所以,布局被更新,鼠标下面的ListBoxItem现在说:“耶!鼠标关闭了,我被选中了!”它有一个突破点时它的唯一原因是它让你有机会在循环继续之前获得鼠标按钮。不幸的是,我不知道如何解决它 - 我试图捕获鼠标事件,并设置一个标志来强制进一步选择,直到鼠标上升,但我无法让它工作。祝你好运! – Jelly