- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个 WPF TreeView 控件,它以分层方式显示员工详细信息。我想显示员工姓名和他们直接和间接报告者的数量(例如,如果员工 C 向 B 报告,B 向A , 那么 A 的直接和间接 reportee 的数量将是 2)
但我能够显示直接报告者 (1) 的数量,但不能显示所有报告者 (2) 的数量。
我已经将数据库中的项目源绑定(bind)为列表(根):
我的xamal:
<TreeView x:Name="tvMain" ItemsSource="{Binding Root}" BorderThickness="0">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Children}">
<StackPanel Orientation="Horizontal">
<Border BorderBrush="#02747474" Background="#02000000" HorizontalAlignment="Center" Margin="0,5,0,0" VerticalAlignment="Top" BorderThickness="1,1,1,1" x:Name="AvatarPhotoBorder">
<Border.BitmapEffect>
<DropShadowBitmapEffect ShadowDepth="7" Softness="0.75"/>
</Border.BitmapEffect>
<Image x:Name="imgPicture" Source="{Binding ImagePath}" Stretch="Uniform" VerticalAlignment="Top" Width="75" Height="60" HorizontalAlignment="Center" />
</Border>
<TextBlock VerticalAlignment="Center">
<TextBlock.Text>
<MultiBinding StringFormat=" {0} {1}">
<Binding Path="FirstName"/>
<Binding Path="LastName"/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
<TextBlock Text=" [Direct and Indirect reportee:" Foreground="LightGray" />
<TextBlock Text="{Binding Count}" Foreground="Gray" />??
<---- <TextBlock Text="{Binding Children.Count}"/>---->this will give only direct reportee count
<TextBlock Text="]" Foreground="LightGray" />
<StackPanel.Style>
<Style>
<Style.Triggers>
<DataTrigger Binding="{Binding IsSelected}" Value="true">
<Setter Property="StackPanel.Background" Value="LightBlue"/>
</DataTrigger>
</Style.Triggers>
</Style>
</StackPanel.Style>
</StackPanel>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
<TreeView.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}" BasedOn="{StaticResource {x:Type TreeViewItem}}">
<Setter Property="IsExpanded" Value="True"/>
<Setter Property="IsSelected" Value="{Binding IsSelected}"/>
</Style>
</TreeView.ItemContainerStyle>
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectedItemChanged">
<i:InvokeCommandAction Command="{Binding SelectedCommand}"
CommandParameter="{Binding ElementName=tvMain, Path=SelectedItem}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</TreeView>
</StackPanel>
查看模型:
public class OrgElementViewModel : ViewModelBase
{
private int Id;
private string firstName;
private string lastName;
private string imagePath;
public int count;
private ObservableCollection<OrgElementViewModel> allchildren;
private ObservableCollection<OrgElementViewModel> children;
private bool isSelected;
public int Count
{
get { return GetAllChildren(); }
set { count = GetAllChildren(); }
}
private int GetAllChildren()
{
int dd =1;
allchildren = new ObservableCollection<OrgElementViewModel>();
//get the list of children from Model
foreach (Node i in OrgChartManager.Instance().GetAllChildren(this.ID))
{
//allchildren.Add(new OrgElementViewModel(i));
dd = dd + 1;
}
return dd;
}
public int ID
{
get { return Id; }
set { Id = value; }
}
public string FirstName
{
get { return firstName; }
set { firstName = value; }
}
public string LastName
{
get { return lastName; }
set { lastName = value; }
}
public string ImagePath
{
get { return imagePath; }
set { imagePath = value; }
}
public bool IsSelected
{
get { return isSelected; }
set
{
isSelected = value;
OnPropertyChanged("IsSelected");
}
}
public ObservableCollection<OrgElementViewModel> Children
{
get
{
if (children == null) //not yet initialized
return GetChildren();
return children;
}
set
{
children = value;
OnPropertyChanged("Children");
}
}
internal OrgElementViewModel(Node i)
{
this.ID = i.Id;
this.FirstName = i.FirstName;
this.LastName = i.LastName;
this.ImagePath = Path.GetFullPath("Images/" + this.ID.ToString() + ".png");
}
internal void ShowChildrenLevel(int levelsShown)
{
if (levelsShown == -1) //show all levels
this.Children = GetChildren();
else if (levelsShown == 0) //don't show any more levels
this.Children = new ObservableCollection<OrgElementViewModel>(); //set as empty
else if (levelsShown > 0) //if a level is requested
{
this.Children = GetChildren();
foreach (OrgElementViewModel i in this.Children)
i.ShowChildrenLevel(levelsShown - 1); //decrement 1 for next level
}
}
private ObservableCollection<OrgElementViewModel> GetChildren()
{
int dd =1;
children = new ObservableCollection<OrgElementViewModel>();
//get the list of children from Model
foreach (Node i in OrgChartManager.Instance().GetChildren(this.ID))
{
children.Add(new OrgElementViewModel(i));
}
return children;
}
}
其他类:
public class OrgTreeViewModel : ViewModelBase
{
private static OrgTreeViewModel self;
private List<OrgElementViewModel> root;
private OrgElementViewModel selected;
private ICommand selectedCommand;
private ICommand changeDisplayLevelCommand;
private int count;
private int displayLevel = -1; //display all levels by default
//the root of the visual tree
public List<OrgElementViewModel> Root
{
get
{
if (root == null)
{
root = new List<OrgElementViewModel>();
root.Add(new OrgElementViewModel(OrgChartManager.Instance().GetRoot()));
}
return root;
}
}
public int Count
{
get { return count; }
set { count = GetCountOfEveryRecursiveObjects(Root, "Children");; }??
}
public OrgElementViewModel Selected
{
get { return selected; }
set
{
selected = value;
selected.IsSelected = true;
ShowChildrenLevel(); //show only the levels chosen by the user
OnPropertyChanged("Selected");
}
}
public ICommand SelectedCommand
{
get
{
if (selectedCommand == null)
{
selectedCommand = new CommandBase(i => this.SetSelected(i), null);
}
return selectedCommand;
}
}
public ICommand ChangeDisplayLevelCommand
{
get
{
if (changeDisplayLevelCommand == null)
{
changeDisplayLevelCommand = new CommandBase(i => ChangeDisplayLevel(i), null);
}
return changeDisplayLevelCommand;
}
}
private void SetSelected(object orgElement)
{
this.Selected = orgElement as OrgElementViewModel;
}
private void ChangeDisplayLevel(object i)
{
int level;
if (int.TryParse(i.ToString(), out level))
{
this.displayLevel = level;
ShowChildrenLevel(); //show only the levels chosen by the user
}
}
private void ShowChildrenLevel()
{
if (this.Selected != null)
{
this.Selected.ShowChildrenLevel(this.displayLevel);
}
}
private OrgTreeViewModel(){}
public static OrgTreeViewModel Instance()
{
if (self == null)
self = new OrgTreeViewModel();
return self;
}
public int GetCountOfEveryRecursiveObjects(IList list, string childrenPropertyName)
{
int count = list.Count;
foreach (object item in list)
{
System.Reflection.PropertyInfo property = item.GetType().GetProperty(childrenPropertyName);
IList childList = (IList)property.GetValue(item, null);??
if (childList == null)
continue;
count += GetCountOfEveryRecursiveObjects(childList, childrenPropertyName);
}
return count;
}
}
我的节点类:
class Node
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public int ParentId { get; set; }
}
我的模型:
public class OrgChartManager
{
private static OrgChartManager self;
//orgchart stored in dictionary
private Dictionary<int, Node> list = new Dictionary<int, Node>();
PersonalDAL dd = new PersonalDAL();
private OrgChartManager()
{
DataTable my_datatable = new DataTable();
my_datatable = new PersonalDAL().loademp();
int ColumnCount = my_datatable.Columns.Count;
int i = 1;
foreach (DataRow dr in my_datatable.Rows)
{
Node node = new Node
{
Id = (int)dr["ID"],
FirstName = (string)dr["FirstName"],
LastName = (string)dr["LastName"],
ParentId = (int)dr["ParentId"]
};
list.Add(i, node);
i++;
}
}
internal static OrgChartManager Instance()
{
if (self == null)
self = new OrgChartManager();
return self;
}
//get the root
internal Node GetRoot()
{
return list[1]; //return the top root node
}
//get the directchildren of a node
internal IEnumerable<Node> GetChildren(int parentId)
{
return from a in list
where a.Value.ParentId == parentId
&& a.Value.Id != parentId //don't include the root, which has the same Id and ParentId
select a.Value;
}
// Recursion method to get all the childeren under purcular ID
internal IEnumerable<Node> GetAllChildren(int parentId)
{
var result = new List<Node>();
var employees = from a in list
where (a.Value.ParentId == parentId
&& a.Value.Id != parentId) //don't include the root, which has the same Id and ParentId
select a.Value;
foreach (var employee in employees)
{
result.Add(employee);
result.AddRange(GetAllChildren(parentId));
}
return result;
}
}
我通过包含递归方法 (GetAllChildren) 修改了模型类。但是在运行此方法时会在行 result.AddRange(GetAllChildren(parentId)); 中抛出错误
最佳答案
如果我们认为您的树节点中有 Children 属性,我们可以使用此方法来计算所有 TreeView 项目:
/// <summary>
/// get count of every recursive objects
/// </summary>
/// <param name="list">your list</param>
/// <param name="childrenPropertyName">your chil property</param>
/// <returns></returns>
public int GetCountOfEveryRecursiveObjects(IList list, string childrenPropertyName)
{
int count = list.Count;
foreach (object item in list)
{
System.Reflection.PropertyInfo property = item.GetType().GetProperty(childrenPropertyName);
IList childList = (IList)property.GetValue(item);
if (childList == null)
continue;
count += GetCountOfEveryRecursiveObjects(childList, childrenPropertyName);
}
return count;
}
测试:
int count = GetCountOfEveryRecursiveObjects((IList)tvMain.ItemsSource, "Children");
关于c# - 如何在wpf treeview中显示所有直接和间接子成员的数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54169875/
我的Angular-Component位于一个flexbox(id =“log”)中。可以显示或隐藏flexbox。 我的组件内部有一个可滚动区域,用于显示日志消息。 (id =“message-li
我真的很困惑 有一个 phpinfo() 输出: MySQL 支持 启用 客户端 API 版本 5.5.40 MYSQL_MODULE_TYPE 外部 phpMyAdmin 显示: 服务器类型:Mar
我正在研究这个 fiddle : http://jsfiddle.net/cED6c/7/我想让按钮文本在单击时发生变化,我尝试使用以下代码: 但是,它不起作用。我应该如何实现这个?任何帮助都会很棒
我应该在“dogs_cats”中保存表“dogs”和“cats”各自的ID,当看到数据时显示狗和猫的名字。 我有这三个表: CREATE TABLE IF NOT EXISTS cats ( id
我有一个字符串返回到我的 View 之一,如下所示: $text = 'Lorem ipsum dolor ' 我正在尝试用 Blade 显示它: {{$text}} 但是,输出是原始字符串而不是渲染
我无法让我的链接(由图像表示,位于页面左侧)真正有效地显示一个 div(包含一个句子,位于中间)/单击链接时隐藏。 这是我的代码: Practice
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 4 年前。 Improve this ques
最初我使用 Listview 来显示 oracle 结果,但是最近我不得不切换到 datagridview 来处理比 Listview 允许的更多的结果。然而,自从切换到数据网格后,我得到的结果越来越
我一直在尝试插入一个 Unicode 字符 ∇ 或 ▽,所以它显示在 Apache FOP 生成的 PDF 中。 这是我到目前为止所做的: 根据这个基本帮助 Apache XSL-FO Input,您
我正在使用 node v0.12.7 编写一个 nodeJS 应用程序。 我正在使用 pm2 v0.14.7 运行我的 nodejs 应用程序。 我的应用程序似乎有内存泄漏,因为它从我启动时的大约 1
好的,所以我有一些 jQuery 代码,如果从下拉菜单中选择了带有前缀 Blue 的项目,它会显示一个输入框。 代码: $(function() { $('#text1').hide();
当我试图检查 Chrome 中的 html 元素时,它显示的是 LESS 文件,而 Firefox 显示的是 CSS 文件。 (我正在使用 Bootstrap 框架) 如何在 Chrome 中查看 c
我是 Microsoft Bot Framework 的新手,我正在通过 youtube 视频 https://youtu.be/ynG6Muox81o 学习它并在 Ubuntu 上使用 python
我正在尝试转换从 mssql 生成的文件到 utf-8。当我打开他的输出 mssql在 Windows Server 2003 中使用 notepad++ 将文件识别为 UCS-2LE我使用 file
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我正在尝试执行单击以打开/关闭一个 div 的功能。 这是基本的,但是,点击只显示 div,当我点击“关闭”时,没有任何反应。 $(".inscricao-email").click(function
假设我有 2 张卡片,屏幕上一次显示一张。我有一个按钮可以用其他卡片替换当前卡片。现在假设卡 1 上有一些数据,卡 2 上有一些数据,我不想破坏它们每个上的数据,或者我不想再次重建它们中的任何一个。
我正在使用 Eloquent Javascript 学习 Javascript。 我在 Firefox 控制台上编写了以下代码,但它返回:“ReferenceError:show() 未定义”为什么?
我正在使用 Symfony2 开发一个 web 项目,我使用 Sonata Admin 作为管理面板,一切正常,但我想要做的是,在 Sonata Admin 的仪表板菜单上,我需要显示隐藏一些菜单取决
我试图显示一个div,具体取决于从下拉列表中选择的内容。例如,如果用户从列表中选择“现金”显示现金div或用户从列表中选择“检查”显示现金div 我整理了样本,但样本不完整,需要接线 http://j
我是一名优秀的程序员,十分优秀!