2014-09-17 5 views
1

Я работаю над приложением WPF (.NET 4.5) и с использованием Caliburn.Micro. Я генерирую список вопросов и ответов в ответах ListBox, которые могут быть из 3-х типов (RadioButtons, DropDowns и текстовые поля). Когда на вопрос ответят, свойства триггеров меняются в ViewModel, и добавляется следующий вопрос.
Проблема, с которой я столкнулся, - это когда символ добавляется к Textbox, он немедленно запускает изменение свойства.Настройка WPF Задержка с кодом в MVVM

public string TextValue 
    { 
     get { return _textValue; } 
     set 
     { 
      _textValue = value; 
      NotifyOfPropertyChange(() => TextValue); 
     } 
    } 

Обычно (для не динамически создаваемых элементов управления) я мог бы задержать его с помощью «нового»

<TextBlock Text="{Binding TextValue, Delay=500}"/>

, но так как я генерируя эти вопросы я не уверен в том, как действовать с этим ,

Есть ли способ установить Delay сгенерированный элемент управления из кода позади?

UPDATE:
это как XAML выглядит. Список заполняется вопросами о времени выполнения (от БД), и вопросы меняются в зависимости от предыдущих ответов, поэтому нет способа установить что-либо в XAML.

<UserControl x:Class="Corp.Conveyancing.Desktop.Views.Probate.PifWFlowQuestionsView" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:probate="clr-namespace:Corp.Conveyancing.Desktop.Views.Probate" 
      mc:Ignorable="d" > 
    <Grid Margin="10" Width="600" Height="400" > 
     <ListBox x:Name="QuestionItems" Grid.Row="0" BorderThickness="0" HorizontalContentAlignment="Stretch" ScrollViewer.CanContentScroll="true" ScrollViewer.VerticalScrollBarVisibility="Visible" Height="380" Width="580" probate:ListBoxExtenders.AutoScrollToEnd="True" > 
      <ListBox.ItemContainerStyle > 
       <Style TargetType="ListBoxItem"> 
        <Setter Property="Focusable" Value="False"/> 
       </Style> 
      </ListBox.ItemContainerStyle> 
     </ListBox> 
    </Grid> 
</UserControl> 

UPDATE2:
Я имею BindableCollection<QuestionItemViewModel> что недвижимость в PifWFlowQuestionsViewModel, к которому я добавляю только первый вопрос, а затем на основе ответа я добавляю больше вопросов, нный, основываясь на тех, добавляя все больше и так далее ,

public class PifWFlowQuestionsViewModel : PropertyChangedBase 
{ 
    private BindableCollection<QuestionItemViewModel> _questionItems = 
     new BindableCollection<QuestionItemViewModel>(); 

    public BindableCollection<QuestionItemViewModel> QuestionItems 
    { 
     get { return _questionItems; } 
     set 
     { 
      _questionItems = value; 
      NotifyOfPropertyChange(() => QuestionItems); 
     } 
    } 
} 
+0

Как вы создаете элементы для ListBox? Введите вывод и datatemplates или вручную создайте элементы управления с помощью кода? – toadflakz

+0

@toadflakz У меня есть 'BindableCollection ', который является свойством в 'PifWFlowQuestionsViewModel', к которому я добавляю только первый вопрос, а затем на основе ответа. Я добавляю больше вопросов, на основе тех, которые добавляют больше и так далее. –

+0

* Проблема, с которой я столкнулся, - это когда символ добавляется в текстовое поле, он немедленно вызывает изменение свойств * ... почему это проблема? – Sheridan

ответ

1

Вот как я решил это решить, возможно, это не решение, но это было быстро и просто.
Я понимаю, что он не отвечает на заголовок вопроса, однако он обеспечивает решение проблемы выше, и я уверен, что кто-то найдет это полезным.

public class QuestionTextViewModel : QuestionItemViewModel 
{ 
    private Timer Timer { get; set; } 

    public QuestionTextViewModel(IEventAggregator eventAggregator, TransactionDetail transactionDetail) 
     : base(transactionDetail) 
    { 
     _eventAggregator = eventAggregator; 
     TransactionDetailId = transactionDetail.TransactionDetailId; 
     this.Timer = new Timer(1500) {AutoReset = false}; 
     this.Timer.Elapsed += TextValueTimer_Elapsed; 
    } 

    public string TextValue 
    { 
     get { return _textValue; } 
     set 
     { 
      _textValue = value; 
      this.Timer.Stop(); 
      this.Timer.Start(); 
     } 
    } 

    private void TextValueTimer_Elapsed(object sender, ElapsedEventArgs e) 
    { 
     NotifyOfPropertyChange(() => TextValue); 
    } 
} 
0

Вы должны быть с помощью ItemTemplateSelector на ListBox и на основе какого типа DataTemplate используется для QuestionItemViewModel на основе возвращаемых свойств для нового элемента.

Было бы возможно сделать генерацию управления в XAML, тогда как вы укажете содержимое DataTemplate.

Смежные вопросы