我正在使用WPF应用程序(.NET 4.5),并使用Caliburn.Micro
。我在ListBox
中生成一个问题和答案列表,答案可以是3种类型(RadioButtons,DropDowns和Textboxes)。当问题得到解答时,属性触发ViewModel中的更改,并且正在添加下一个问题
遇到的问题是当符号被添加到Textbox
时,它会立即触发属性更改。
public string TextValue
{
get { return _textValue; }
set
{
_textValue = value;
NotifyOfPropertyChange(() => TextValue);
}
}
通常(对于非动态生成的控件)我可以使用'new'
来延迟它 <TextBlock Text="{Binding TextValue, Delay=500}"/>
但由于我提出这些问题,我不知道如何处理这个问题。
有没有办法将Delay
设置为从后面的代码生成控件?
更新
这就是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 :(得分: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);
}
}
答案 1 :(得分:0)
您应该在ItemTemplateSelector
上使用ListBox
,并根据新项目的返回属性确定DataTemplate
的{{1}}类型。
当您指定QuestionItemViewModel
内容时,肯定可以在XAML中执行控件生成。