【发布时间】:2011-04-27 20:50:28
【问题描述】:
我查看了几个相关的答案,并确定我可以通过设置 lstData.SelectedIndex = -1; 以编程方式清除选择。但是,当我在启动时设置数据上下文后立即执行此操作时,不知何故它永远不会起作用并被设置为选择列表中的第一个元素。
我还尝试将设置添加到 XAML,-1 实际上是 Visual Studio 的默认值,尽管它实际上不在 XAML 中,除非您设置它。即:
<ListView Margin="6,6,6,203"
IsSynchronizedWithCurrentItem="True"
x:Name="lstData"
ItemsSource="{Binding}"
SelectionChanged="lstData_SelectionChanged"
HorizontalContentAlignment="Right"
ItemContainerStyle="{StaticResource ItemContStyle}"
SelectedIndex="-1">
但这也没有效果。
另外,有趣的是,如果我输入 lstData.SelectedIndex = 3;在我的 LoadData 方法中,它将从选择的第三个成员开始设置。
这是我相关的窗口加载代码:
public Window1()
{
InitializeComponent();
// Set start and end dates to day after tomorrow, and
// the next day, by default:
StartDate = DateTime.Now.AddDays(1);
EndDate = StartDate.AddDays(2);
txtStartDate.Text = StartDate.ToShortDateString();
txtEndDate.Text = EndDate.ToShortDateString();
LoadData();
}
public void LoadData()
{
App.RefreshMembers();
App.CalculateNeededMeals(StartDate, EndDate);
// Bind the ListBox to our ObserveableCollection
LayoutRoot.DataContext =
App.db.PFW_Members.OrderBy("FullName",true).OrderBy("CancelDate",true);
lstData.SelectedIndex = -1;
}
并且在其他情况下会调用 LoadData(),在这种情况下,它会清除选择。只是不是第一次加载窗口。好像有一些初始化线程没有真正完成,如果在启动时选择为 -1,则将选择设置为 0。
哦,是的,我确实有一个选择更改处理程序,但它不会更改选择,即:
private void lstData_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (lstData.SelectedItem == null)
{
btnReactivate.IsEnabled = false;
btnDeactivate.IsEnabled = false;
}
else
{
if (((PFW_Member)lstData.SelectedItem).CancelDate == null)
{
btnReactivate.IsEnabled = false;
btnDeactivate.IsEnabled = true;
}
else
{
btnReactivate.IsEnabled = true;
btnDeactivate.IsEnabled = false;
}
}
}
有没有办法让它真正等到加载,然后做一些事情,或者设置一个延迟事件或其他东西,或者有人对这里可能发生的事情有知识或理论吗?
感谢任何提示!
【问题讨论】:
-
那你为什么不把它放在窗口加载事件中呢?
-
因为我不知道是什么导致它无法工作,而且我还不熟悉 WPF 中的窗口加载事件(我现在要去看看)。您的建议也很好,因为它提供了一种方法来做想要的事情,并且如果我想要的话,IsSynchronizedWithCurrentItem 仍然是真实的。
标签: wpf listview selection selecteditem