目前我有以下语法(list是包含具有许多不同属性的对象的列表(其中Title是其中之一):
for (int i=0; i < list.Count; i++)
{
if(title == list[i].Title)
{
//do something
}
}
Run Code Online (Sandbox Code Playgroud)
如何在list[i].Title
不必遍历整个集合的情况下访问它?由于我的列表越来越大,这可能会影响我的程序的性能.
我在我的程序中有很多类似的语法(通过for循环和索引访问公共属性).但我确定必须有一个更好,更优雅的方式来做到这一点?
由于我的列表包含对象,因此find方法似乎确实是一个选项.
编辑2:当图表填充时,我无法再更改值.即使我更改列表中的值(ItemControls从中获取值),图表似乎也不会使用新值更新.
我调用计时器中的GetDataGrafiek()方法每隔x秒更新一次我的图表.
Grafiek graf = new Grafiek();
graf.GetDataGrafiek();
Run Code Online (Sandbox Code Playgroud)
这是因为线程计时器在一个单独的线程中运行(IsAsynchronous
方法中ObjectDataProvider
)还是我需要DataContext
在我的计时器方法中访问ItemsControl?
编辑:我无法在程序运行时填充图表,所以我创建了ObservableCollection<GrafiekBar>
静态(保存条形的填充和值的列表)并初始化如下:
public static ObservableCollection<GrafiekBar> listGrafiek = new ObservableCollection<GrafiekBar>()
{
new GrafiekBar() {Value = 0, Fill = (Brush)convertor.ConvertFromString(kleuren[0])},
new GrafiekBar() {Value = 0, Fill = (Brush)convertor.ConvertFromString(kleuren[1])},
new GrafiekBar() {Value = 0, Fill = (Brush)convertor.ConvertFromString(kleuren[2])}
};
Run Code Online (Sandbox Code Playgroud)
从MSDN:ObjectDataProvider:"但是,如果您绑定到已创建的对象,则需要在代码中设置DataContext,如下例所示."
我有一个ItemsControl,显示为一个简单的条形图.当我分配值(在我的codeBehind中硬编码)时,图表会成功填充.
我所做的基本上是将最大值设置为100%并计算其余条形的长度.
问题:
我不希望图表栏值硬编码,但条形图必须更改runTime.为此,我使用的Threading.Timer
是每当我的程序运行时每秒运行一次(此计时器中也会发生其他计算).
图表栏值根据每x秒内在此计时器内发生的计算得到更新.
我已经尝试了所有内容,但在程序运行时我无法显示值.当我对它们进行硬编码时,我只能看到条形图(参见GetDataGrafiek()
线程末尾的区域).我究竟做错了什么/失踪了?
的 GetDataGrafiek()
(计算来填充我的图表)被调用的ObjectDataProvider
.
此方法将TimeSpan作为输入,然后执行计算,以便获得Double Value(基于上面解释的100%值),然后将其放置在bar的值(= dateTemplate的宽度)中.
<ObjectDataProvider x:Key="odpLbGrafiek" ObjectType="{x:Type myClasses:GrafiekBar}" MethodName="GetDataGrafiek"/> …
Run Code Online (Sandbox Code Playgroud)