WPF中的ListBox迭代

3

我有一个绑定到可观察集合的Listbox,XAML代码片段显示了每个项的内容(textblocks和Slidercontrol)。Slidercontrol最初设置为不可见。

         ListBox.ItemTemplate>
             <DataTemplate>
               <StackPanel Orientation="Vertical" Width="500">

                 <stackPanel Orientation="Horizontal">
                   <TextBlock Margin="0,0,0,0"  Width="100"........
                   <TextBlock Margin="200,10,0,0" Width="100"........ 
                 </StackPanel>

                <Slider Margin="0,0,0,0" Height="100".................

                 <StackPanel Orientation="Horizontal">
                   <TextBlock Width="100" TextWrapping="Wrap"..............
                   <TextBlock Width="100" TextWrapping="Wrap"...............
                 </StackPanel>                                
              </StackPanel>
            </DataTemplate>
         </ListBox.ItemTemplate>

我希望首先检查observableCollection列表对象的某个时间属性,如果时间在当前系统时间范围内,我想激活相应的滑块控件ListBox Item并更新它,滑块指示时间进度并更新直到结束时间,并且用户无法移动它,但是如何访问或迭代ListBoxitem,以便我可以通过visualhelptree激活滑块控件。救命啊!!!

2个回答

2

再次更新


首先,只要您只是使用Slider来显示时间进度,那么正确的控件是ProgressBar控件(Slider控件用于让用户更改值,例如更改媒体播放器的音量)。此外,您可以更轻松地实现此操作,而无需使用TreeVisualHelper。假设您绑定到以下ObservableCollection对象:

ObservableCOllection<MyObject> Collection;

编辑MyObject类并添加一个double属性以指示ProgressBar的进度值,此外添加一个Timer对象,每5分钟触发一次检查两个时间并通过更改布尔值来决定是否启用滑块,类似于以下内容:

public class MyObject
{
    public DateTime StartTime { get; set; }
    public DateTime EndTime { get; set; }

    public double ProgressValue { get; set; }
    private System.Timers.Timer TimeChecker;

    public MyObject()
    {
         // 5 Minutes = 5 * 60 Seconds = 5 * 60 * 1000 Milliseconds
         TimeChecker = new Timer(300000);
         TimeChecker.Elapsed += CheckTimes;
    }


    public CheckTimes()
    {
         // Check StartTime and EndTime to decide whether to enable the slider or not.
         if(...)
         {
              // Here you can add the appropriate value to indicate the current progress
              ProgressValue == ....;
         }
         else
              ProgressValue == ....;
    }
}

然后,在项目模板中,将您的ProgressBar.Value属性绑定到ProgressValue属性,类似于以下示例:

<BrogressBar Value="{Binding ProgressValue}"/>

这样每个条目都将拥有自己的计时器。更好的替代方案是只有一个计时器,每5分钟迭代整个集合并执行必要操作。


@AshwinNagarajan,将滑块控件更改为进度条。看看我的新更新,给我反馈。 - Mohammed A. Fadil
我可以这样做吗 IsEnabled="{Binding IsEnabled_Progress}" Visibility="Collapsed" Value="{Binding ProgressValue}".... - Ashwin Nagarajan
你不需要禁用/启用ProgressBar,无论如何用户都无法与其交互,它只是用来显示进度的。另一方面,如果你想要显示/隐藏ProgressBar,那么你需要在MyObject类中创建一个Visibility属性,并将ProgressBar.Visibility绑定到它,类似于<ProgressBar Visibility={Binding IsProgressVisible}.../> - Mohammed A. Fadil
欢迎,老兄。IsEnabled_Progress属性的类型是什么?它必须是Visibility类型而不是bool类型。 - Mohammed A. Fadil
大能的大人,我再次向您提问... http://stackoverflow.com/questions/10650512/wpf-listbox-collapsible - Ashwin Nagarajan
显示剩余4条评论

1

尝试使用ValueConverter - 您需要类似于这样的东西:

<Slider Margin="0,0,0,0" Height="100" IsEnabled="{Binding Path=Time, Converter={StaticResource IsTimeNearSystemTimeConverter}}" />

编辑

听起来你需要使用多绑定和多值转换器。

public class BetweenTimesMultiValueConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        var time1 = (DateTime)values[0];
        var time2 = (DateTime)values[1];
        var current = DateTime.Now;
        return time1 > current && time2 < current;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

将上述类作为静态资源添加到您的XAML中,然后像这样使用它:

<Slider Margin="0,0,0,0" Height="100">
    <Slider.IsEnabled>
        <MultiBinding Converter="{StaticResource betweenTimeConverter}">
            <Binding Path="EarlyTime" />
            <Binding Path="LateTime" />
        </MultiBinding>
    </Slider.IsEnabled>
</Slider>

但我猜这更像是静态的,我的observableColletion列表对象中有两个时间属性。如果时间在这两个时间之间,我会启用转换器并每5分钟更新一次,当时间不再在开始和结束时间之间时禁用。如果您能告诉我如何为此场景编写动态IvalueConverter类,我将不胜感激。感谢您的帮助。 - Ashwin Nagarajan
谢谢Dean,感谢您的回复。基本上滑块代表时间的进度,我需要找到一种更新滑块值的方法,感谢您的帮助。 - Ashwin Nagarajan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接