我有一个标准的WPF树视图项目,其中包含许多子项。以编程方式创建树时,我将选定的事件处理程序添加到父项和子项。我发现的是,当子项目选择事件被触发并被处理后,然后触发父事件。这个问题是我根据所选项填充数据网格。因此,每次选择子项后,datagrid都会重置为父项选择。
请有人解释这个项目是否正常,或者我是否做错了以及如何解决。
如果您需要更多信息,请与我们联系。
连接事件处理程序:
//parent
TreeViewItem tvi = new TreeViewItem();
tvi.Header = str;
tvi.Selected += CoreSupplierSelected
//child
TreeViewItem tvi = new TreeViewItem();
tvi.Header = str;
tvi.Tag = resinSystems.Values[i];
tvi.Selected += CoreResinSystemSelected;
处理程序:
private void CoreSupplierSelected(object sender, RoutedEventArgs e)
{
TreeViewItem item = e.OriginalSource as TreeViewItem;
MaterialSelectionData thicknessData = editInterface.GetCoreThicknessData(new List<object>() { item.Tag }, null);
List<string> columnNames = thicknessData.DisplayFieldTitles;
columnNames.Insert(0,"");
DataTable dt = GUICommon.DatableConverter.ToDataTable(thicknessData.DisplayData, columnNames);
dtgCores.ItemsSource = dt.AsDataView();
dtgCores.Columns[0].Visibility = System.Windows.Visibility.Collapsed;
}
private void CoreResinSystemSelected(object sender, RoutedEventArgs e)
{
TreeViewItem item = e.OriginalSource as TreeViewItem;
GX3MaterialSelectionData thicknessData = editInterface.GetCoreThicknessData(new List<object>() { ((TreeViewItem)item.Parent).Tag }, new List<object>() { item.Tag });
List<string> columnNames = thicknessData.DisplayFieldTitles;
columnNames.Insert(0, "");
DataTable dt = GUICommon.DatableConverter.ToDataTable(thicknessData.DisplayData, columnNames);
dtgCores.ItemsSource = dt.AsDataView();
e.Handled = true;
dtgCores.Columns[0].Visibility = System.Windows.Visibility.Collapsed;
}
答案 0 :(得分:7)
这必须与你的代码有关。我现在正在使用TreeView,子选择不会触发父选择。你可以发布更多的代码吗?也许我可以发现这个问题。
我的立场得到了纠正。在仔细查看我的代码并运行一些测试之后,这似乎是控件的正常行为。如果您不希望选择冒泡,那么您应该将Handled
值设置为true
参数的RoutedEventArgs
。
编辑:
这是我使用的XAML:
<TreeView Width="200" Height="300">
<TreeViewItem Header="Parent" Selected="Parent_Selected">
<TreeViewItem Header="Child" Selected="Child_Selected" />
</TreeViewItem>
<TreeViewItem Header="Parent" Selected="Parent_Selected">
<TreeViewItem Header="Child" Selected="Child_Selected" />
</TreeViewItem>
</TreeView>
代码:
private void Parent_Selected(object sender, RoutedEventArgs e)
{
bool test = false;
}
private void Child_Selected(object sender, RoutedEventArgs e)
{
bool test = false;
// e.Handled = true;
}
如果e.Handled = true
语句被评论,那么当选择子对象时,Parent_Selected
将触发。
答案 1 :(得分:1)
我发现了我的问题。
当我在子选择事件处理程序中设置断点时,问题才出现。如果没有设置断点,则一切正常,并且数据网格将被填充,就像选择了子项一样。 如果在父选定事件中仅设置了断点,则在选择子项时不会触发断点。 但是,只要在子项中添加断点,就会直接触发父选定处理程序中的断点。
任何人都可以解释这个或者它只是一个错误是Visual Studio吗?
答案 2 :(得分:0)
在点击儿童treenode之后选择父treenode的问题可能有另一个可能的原因: 如果在treeview的选择中更改了事件处理程序,则将Focus更改为除树视图本身之外的其他控件(例如,调用另一个控件的Focus()函数),这将导致树视图在当前事件之后引发另一个选择更改事件,这将将父级设置为已选中。 (为了使调试更加困难,visual studio调用堆栈窗口不会告诉哪个例程触发了此事件。)
相关问题(和答案)在这里:TreeView auto-selecting parent after user selects child
可能不是这个问题的原因,但是发布在这里以防万一有人被这个“奇怪”的问题所驱使(就像我刚刚遭遇的那样)。