- 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/
我有这个 html 代码: HELLO WORLD! X V HELLO WORLD! X V 我想按 X(类关闭)将父 div 的高度更改为 20px 并显示 V(类打开),但在每个 d
在会计应用程序的许多不同实现中,有两种主要的数据库设计方法来保存日志和分类帐数据。 只保留 Journal 信息,然后 Ledger 只是 Journal 的一个 View (因为 journal 总
我想在另一个子里面有一个子, sub a { sub b { } } 我想为每次调用 sub b 创建一个新的 sub a 实例。有没有办法在 Perl 中做到这一点? 当我运行上面的
我有一些代码正在查找重复项并突出显示单元格: Private Sub cmdDups_Click() Dim Rng As Range Dim cel As Range Set Rng = ThisW
可能有一个简单的解决方案,但我很难过。 我有一个包含一个 ID 字段的主表。在两个可能的字段中有一个具有该 ID 的子表。想象一个由选手 A 和选手 B 组成的 double 队。Master 表将有
假设我有一个包含对象的数组: [ { "id": "5a97e047f826a0111b754beb", "name": "Hogwarts", "parentId": "
我正在尝试对 MySQL 数据库表执行一对父/子模型的批量插入,但似乎无法使用标准的 ActiveRecord 功能来完成。所以,我尝试了 activerecord-import gem,但它也不支持
我有一个带有多个子类的父抽象类。最终,我希望通过 GUI 中的进度条显示子类中完成的进度。 我目前所做的,我意识到这是行不通的,是在父类中声明为每个子类将覆盖的虚拟方法的事件方法定义。所以像: pub
是否可以通过键数组在对象中设置变量?例如我有这个对象: var obj = {'outer': {'inner': 'value'} }; 并希望设置由键数组选择的值: var keys = ['ou
我有一个名为 companies 的 MySQL 表,如下所示: +---------+-----------+-----------+ | id_comp | comp_name | id_pare
我正在尝试使用 sublime text 在 sublime text 上的 ionic 上打开我的第一个应用程序。它给了我一个“找不到命令”的错误。如何修复? 我试过这些命令: sudo rm -r
不好意思问,但我正在使用 webapp2,我正在设计一个解决方案,以便更容易定义路由 based on this google webapp2 route function .但这完全取决于能够在子级
我有代表树的数字字符串(我不知道是否有官方名称): 012323301212 上面的例子代表了 2 棵树。根用 0 表示。根的直接子代为“1”,“1”的直接子代为“2”,依此类推。我需要将它们分组到由
是否可以在当前 Activity 之上添加 Activity 。例如,假设我单击一个按钮,然后它将第二个 Activity 添加到当前 Activity 。而第二个 Activity 只覆盖了我当前
我很难思考如何为子资源建模。 以作者的书籍为例。你可以有 N 本书,每本书只有一位作者。 /books GET /books POST /books/id PUT /books/id DELETE 到
有人可以向我解释以下内容(python 2.7) 来自已解析文件的两个字符串数字: '410.9''410.9 '(注意尾随空格) A_LIST = ['410.9 '] '410.9' in '41
背景 在 PowerShell 中构建 hash table 是很常见的通过特定属性快速访问对象,例如以 LastName 为基础建立索引: $List = ConvertFrom-Csv @' I
我真的很难弄清楚如何调用嵌套 Polymer Web 组件的函数。 这是标记: rise-distribution组件有 canPlay我想从 rise-playlist
我写了一个小工具转储(以 dot 格式)一个项目的依赖关系图,其中所有位于同一目录中的文件都聚集在一个集群中。当我尝试生成包含相应图形的 pdf 时,dot开始哭: 命令 dot -Tpdf trim
给定一个 CODE ref,是否可以: 访问该 CODE ref 的解析树 通过指定 CODE ref 的解析树来创建一个新的 CODE ref,该解析树可以包含在 1 中返回的解析树的元素 通常我们
我是一名优秀的程序员,十分优秀!