为什么我的属性未按预期设置?

时间:2015-08-23 13:45:48

标签: c# wpf

我正在编写一个WPF应用程序,我会跟踪一些项目。总共有30多个项目,可以跟踪,但没有一个必须。这反映在设置部分填充的List I中(下面的TrackedItems对象)。

我总共使用了10个Stackpanel来显示这些项目。我为他们制作了一个集合,以便于访问(StackedpanelsForTrackedItems)

用户可以选择将显示的面板减少到3,5或10(Preferences.NumberNodesDisplayed包含该数字)以减少混乱。因此,无论跟踪了多少项,都不应该有比此选项允许的更多可见SP。

此外,应用程序应识别当前跟踪的项目数量是否少于当前选定的项目。

例如,如果我目前只跟踪6个项目,但选项设置为10,则它应该只显示前6个SP。

我提出了这个逻辑:

Collection<UIElement> StackpanelsForTrackedItems = new Collection<UIElement>();
foreach (UIElement element in StackpanelItemParent.Children)
{
    if (element is StackPanel)
    {
         StackPanel sp = (StackPanel)element;
         StackpanelsForTrackedItems.Add(sp);
    }
}
int i = 0;
foreach (UIElement item in StackpanelsForTrackedItems)
{ 
        if ((i < TrackedItems.Count) && (i < Preferences.NumberNodesDisplayed))
            item.Visibility = Visibility.Visible;
        else
            item.Visibility = Visibility.Collapsed;
        i++;
}

现在如果我选择让我们说6个项目(这意味着TrackedItems.Count = 6)并且我选择最多显示10个项目(这意味着Preferences.NumberNodesDisplayed = 10)它仍然应该设置的可见性 StackpanelsForTrackedItems [6]到StackpanelsForTrackedItems [9]在&#39;折叠&#39;,但它没有,它总是显示每10个SP。

如果(i&lt; TrackedItems.Count)已经为假,if-statement如何成为真?

我认为我的逻辑存在一个重大缺陷,但我无法找到它。

请帮助:)

编辑:按要求

<StackPanel x:Name="StackpanelItemParent" Orientation="Vertical">
    <StackPanel x:Name="StackpanelItem1" Orientation="Horizontal">
        // stuff here...
    </StackPanel>
    <StackPanel x:Name="StackpanelItem2" Orientation="Horizontal">
        //stuff here...
    </StackPanel>
    <StackPanel x:Name="StackpanelItem3" Orientation="Horizontal">
        // stuff here...
    </StackPanel>
    <StackPanel x:Name="StackpanelItem4" Orientation="Horizontal">
        // stuff here...
    </StackPanel>
    <StackPanel x:Name="StackpanelItem5" Orientation="Horizontal">
        // stuff here...
    </StackPanel>
    //
    //
    //
    <StackPanel x:Name="StackpanelItem10" Orientation="Horizontal">
        // stuff here...
    </StackPanel>
</StackPanel>

当我调试

时,集合会正确填充

StackpanelsForTrackedItems [0]将是StackpanelItem1

StackpanelsForTrackedItems [1]将是StackpanelItem2

StackpanelsForTrackedItems [2]将是StackpanelItem3等。

我看到没有错误: - /

EDIT2: 我发现了这个错误,我猜得太愚蠢了。

当我在没有断点的情况下运行应用程序并将项目更改为跟踪时,出现上述行为

所以我继续设置断点来追踪所有变量,这阻止了我的应用程序执行方法,TrackedItems对象再次被填充...

一个简单的TrackedItems.Clear()修复了所有内容,显然一旦稍后再次调用该方法,该列表中将有12个项目而不再是6个

我觉得现在问这个问题真的很尴尬:( 至少我设法自己跟踪它,我从评论中学到了一两件事,所以它不是完全浪费我猜

感谢大家尝试提供帮助,非常感谢!

1 个答案:

答案 0 :(得分:0)

我已将逻辑模拟到布尔列表中。 True表示显示,而false表示隐藏。

以下用户选择了10个要跟踪的项目,但仅存在6个项目:

var StackpanelsForTrackedItems = Enumerable.Range(0, 10)
                                           .Select (e => true)
                                           .ToList();
int tracked = 6;
int max = 10;

StackpanelsForTrackedItems.Select ((sp, index) => sp = (index < max) && (index < tracked));

结果:

enter image description here

对于

int tracked = 6;
int max = 3;

结果

enter image description here

对于WPF可见性更改

 .Select ((sp, index) => sp.Visibility = 
                            ((index < max) && (index < tracked)) ? Visibility.Visible
                                                                 : Visibility.Collapsed);