2012-04-25 2 views
3

У меня есть Listbox привязан к наблюдаемой коллекции и XAML сниппета показывает, что каждый элемент будет содержать (TextBlocks и Slidercontrol) Slidercontrol установлен в невидимое intiallyListBox итерация WPF

  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 элемента управления ползунком и обновить его, тонер указывает на прогресс во времени и обновляется до конца, и пользователь не может его переместить, но как мне получить доступ или итерации ListBoxitem, чтобы я мог активировать управление ползунка через visualhelptree.HELP !!!!!!

ответ

2

Обновлено Опять


Прежде всего, до тех пор, как ваш просто используя Slider подковать только прогресс во времени, то право управления для использования является ProgressBar управления (The Slider элемент управления используется, чтобы позволить пользователю изменить значение, например, изменить объем мультимедийного проигрывателя). Более того, вы можете реализовать это более легко, без использования TreeVisualHelper. Допустим, что ваш являются обязательными к следующему ObservableCollection объекта:

ObservableCOllection<MyObject> Collection; 

Редактировать MyObject класс и добавить double свойство, чтобы указать значение прогресса для ProgressBar, более того добавить Timer объект стрелять каждые 5 минут, чтобы проверить два раз и решает, следует ли включать Slider или не путем изменения логического значения, sothing как происходит некорректно:

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 собственности, это Wi что-то похожее на следующее:

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

Таким образом, каждый элемент будет иметь свой собственный таймер. Лучшая альтернатива - иметь только один таймер, который каждые 5 минут выполняет итерацию через сборку и делает то, что необходимо.

+0

У меня есть 2 свойства внутри MYObject StartTime и EndTime, я бы хотел чтобы включить слайдер после времени запуска и обновить его каждые 5 минут до достижения конечного времени, а затем отключить управление слайдером, оцените вашу помощь. –

+0

@AshwinNagarajan, проверьте мой обновленный ответ. –

+0

Мохаммед Хороший материал получил другие идеи со связыванием для других элементов управления, но как бы я обновил значение ползунка, в основном слайдер представляет собой прогресс времени, возможно, я должен был сказать это раньше. –

1

Попробуйте ValueConverter - вам нужно что-то вроде этого:

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

EDIT

звучит как вы будете должны сделать MultiBinding с 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> 
+0

спасибо Дин, я дам этот снимок ... –

+0

, но я думаю, что это больше похоже на статические, у меня есть два свойства времени в моем объекте listableColletion list, если время между этими двумя моментами i ebanle конвертер и обновлять его каждые 5 мин и отключить, когда время не больше между временем начала и окончания, я был бы признателен, если бы вы могли сказать мне, как я могу написать динамический класс IvalueConverter для этого сценария, оцените вашу помощь. –

+0

см. Редактировать, например, –