C# 使用ObservableCollection不更新数据控件的UI
我有一个telerik RadTreeListView,它由一个C#DataTable类填充。我只想在项目被删除或添加到DataTable时刷新RadTreeListView UI(我现在不关心项目属性何时更改) 我已经研究并尝试使用ObservaleCollection类,当我删除或向dataTable添加项时,我可以从调试器中看到dt对象已经更改,但问题是RadTreeListView没有更新。即使我调用它的重新绑定方法,它仍然显示相同的旧数据 RadtreeView列表XAMLC# 使用ObservableCollection不更新数据控件的UI,c#,silverlight,data-binding,telerik,observablecollection,C#,Silverlight,Data Binding,Telerik,Observablecollection,我有一个telerik RadTreeListView,它由一个C#DataTable类填充。我只想在项目被删除或添加到DataTable时刷新RadTreeListView UI(我现在不关心项目属性何时更改) 我已经研究并尝试使用ObservaleCollection类,当我删除或向dataTable添加项时,我可以从调试器中看到dt对象已经更改,但问题是RadTreeListView没有更新。即使我调用它的重新绑定方法,它仍然显示相同的旧数据 RadtreeView列表XAML <
<telerik:RadTreeListView x:Name="radTreeListView" ItemsSource="{Binding Items}"
SelectionMode="Multiple" AutoGenerateColumns="False" FontSize="11" SelectionChanged="radTreeListView_SelectionChanged">
<telerik:RadTreeListView.ChildTableDefinitions>
<telerik:TreeListViewTableDefinition ItemsSource="{Binding Items}" />
</telerik:RadTreeListView.ChildTableDefinitions>
<telerik:RadTreeListView.Columns >
<telerik:GridViewSelectColumn />
<telerik:GridViewDataColumn DataMemberBinding="{Binding Name}" Header="Name" />
<telerik:GridViewDataColumn DataMemberBinding="{Binding StartDate}" Header="Start Date" />
<telerik:GridViewDataColumn DataMemberBinding="{Binding EndDate}" Header="End Date" />
</telerik:RadTreeListView.Columns>
</telerik:RadTreeListView>
请考虑更改以下声明:public类测试:StababCeleLink,子元素的类型不应该类似于集合类型本身。 另一件事,删除行:public new observetecollection Items{get;set;}
关于如何使代码正常工作,请尝试以下方法(代码中嵌入注释):公共类测试
{
私有测试(字符串strName、字符串strID、字符串StartDate、字符串EndDate、字符串strParentId、测试类别父项)
{
ParentId=strParentId;
名称=strName;
ID=strID;
this.StartDate=StartDate;
this.EndDate=EndDate;
父项=母项;
}
公共字符串ID{get;set;}
公共字符串名称{get;set;}
公共字符串StartDate{get;set;}
公共字符串EndDate{get;set;}
公共字符串ParentId{get;set;}
测试父项{get;set;}
}
公共类TestsCollection:ObservableCollection
{
//看起来你想在这里实现一个Singleton:
静态TestsCollection实例=null;
公共静态测试收集GetWarehouseData(数据表dt)
{
if(实例==null)
{
instance=newtestscolection();
}
//在此处添加您的转换代码,但:
//您必须在之前绑定的同一实例上工作,
//不要每次都创建一个新的,因为它不会是您绑定到GUI的那个
返回实例;
}
}
关于绑定行:每次创建一个新的UI对象并绑定到它时,这不是GUI上显示的那个 检查此处的awnser()以及您在哪里调用“GetWarehouseData”?您确定绑定设置正确吗?你应该添加telerik标签,因为它可能是相关的。使用snoop检查绑定是否设置正确。你的编辑让我很难回答“什么”。您在数据绑定方面没有问题。您在理解基本OOP方面有问题。当您在完全不相关的对象实例上执行操作时,您希望UI如何更新?
namespace ProjectServerDashboard
{
public class Test : ObservableCollection<Test>
{
private Test(string strName, string strID, string StartDate, string EndDate, string strParentId,Test Cat_parent)
{
ParentId = strParentId;
Name = strName;
ID = strID;
this.StartDate = StartDate;
this.EndDate = EndDate;
Parent = Cat_parent;
Items = new ObservableCollection<Test>();
}
public string ID { get; set; }
public string Name { get; set; }
public string StartDate { get; set; }
public string EndDate { get; set; }
public string ParentId { get; set; }
Test Parent { get; set; }
public new ObservableCollection<Test> Items { get; set; }
public static ObservableCollection<Test> GetWarehouseData(DataTable dt)
{
var clubs = new ObservableCollection<Test>();
Test parent = null;
Test firstChild = null;
Test secondChild = null;
for (int i = 0; i < dt.Rows.Count; i++)
{
string strTaskParentUID = Convert.ToString(dt.Rows[i]["TID"]).Trim();
string strTaskID = Convert.ToString(dt.Rows[i]["TID"]).Trim();
string strTaskName = Convert.ToString(dt.Rows[i]["TName"]);
string strTaskStartDate = Convert.ToString(dt.Rows[i]["TDate"]);
string strTaskEndDate = Convert.ToString(dt.Rows[i]["TEndDate"]);
int TaskOutlineLevel = Convert.ToInt32(dt.Rows[i]["TLevel"]);
if (i == 0 && TaskOutlineLevel == 1)
{
parent = new Test(strTaskName, strTaskID, strTaskStartDate, strTaskEndDate,strTaskParentUID, null);
}
else
{
switch (TaskOutlineLevel)
{
case 2:
firstChild = new Test(strTaskName, strTaskID, strTaskStartDate, strTaskEndDate,
strTaskParentUID, parent);
if (parent.ID == strTaskParentUID)
{
parent.Items.Add(firstChild);
}
break;
case 3:
secondChild = new Test(strTaskName, strTaskID, strTaskStartDate, strTaskEndDate,
strTaskParentUID, firstChild);
if (firstChild.ID == secondChild.ParentId)
{
firstChild.Items.Add(secondChild);
}
break;
}
}
}
clubs.Add(parent);
SessionApp.SessionManager.Session["myDataTable"] = clubs
return clubs;
}
}
}
NestedTreeView objNestedTreeView = new NestedTreeView();
objNestedTreeView.radTreeListView.ItemsSource = Test.GetWarehouseData((DataTable)SessionApp.SessionManager.Session["myDataTable"]);
public class Test
{
private Test(string strName, string strID, string StartDate, string EndDate, string strParentId, Test Cat_parent)
{
ParentId = strParentId;
Name = strName;
ID = strID;
this.StartDate = StartDate;
this.EndDate = EndDate;
Parent = Cat_parent;
}
public string ID { get; set; }
public string Name { get; set; }
public string StartDate { get; set; }
public string EndDate { get; set; }
public string ParentId { get; set; }
Test Parent { get; set; }
}
public class TestsCollection : ObservableCollection<Test>
{
// looks llike you try to implement here a singelton:
static TestsCollection instance = null;
public static TestsCollection GetWarehouseData(DataTable dt)
{
if (instance == null)
{
instance = new TestsCollection();
}
// here add your conversion code but:
// you must work on the same instance that you bound before that,
// dont create a new one each time, as it will not the one that you bound to your GUI
return instance;
}
}