3

我有一个绑定到可观察集合的列表框,XAML 片段显示每个项目将包含的内容(文本块和 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 列表对象的某些 Time 属性,如果时间在当前系统时间之内,我想激活相应的滑块控件 ListBox Item 并更新它,silder 指示及时进度并更新到结束时间,用户无法移动它,但是我如何访问或迭代 ListBoxitem 以便我可以通过 visualhelptree.HELP 激活 Slider 控件!!!!!!

4

2 回答 2

2

再次更新


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

ObservableCOllection<MyObject> Collection;

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

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 分钟遍历一次集合并执行必要的操作。

于 2012-04-25T12:14:30.103 回答
1

试试 ValueConverter - 你需要这样的东西:

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

编辑

听起来你需要使用 multivalueconverter 进行多重绑定

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>
于 2012-04-25T11:52:49.067 回答