实时更新XAML组件的可见性 - UWP
我有一个定期线程在我的UWP应用程序的后台运行,我想将某些组件的可见性与其执行联系起来。我使用的卡利和结合这样的组件:实时更新XAML组件的可见性 - UWP
<TextBox Name="sample" Visibility="{Binding JobStatus}" />
C#:
public string JobStatus
{
get
{
if(SponsorReferralUploadService.IsRunning())
return "Collapsed";
else
return "Visible";
}
}
这个布尔值是从应用程序的服务层来了,所以它不是我能够改写/重新设计所有那些代码和实现INotifyPropertyChanged
接口。
当我打开这个网页时,TextBox
的Visibility
设置布尔是真还是假的,我怎么能的方式,只要布尔值更新时,Visibility
属性更改设定此?
为了澄清,在WPF数据绑定不连续重新评估。一旦UI获得JobStatus属性的值,就不会再提问。除非,你告诉它。
比较常见的方式做,这是贯彻落实INotifyPropertyChanged
您的视图模型再火PropertyChanged事件。但你也可以强制绑定到通过调用绑定表达式的方法UpdateTarget
编程更新:
sample.GetBindingExpression(TextBlock.VisibilityProperty).UpdateTarget();
没有某种事件的告诉你当调用这个方法,你将被迫把它反复用一个定时器:
var timer = new System.Windows.Threading.DispatcherTimer();
timer.Interval = TimeSpan.FromSeconds(1.0);
timer.Tick += timer_Tick;
timer.Start();
...
void timer_Tick(object sender, EventArgs e)
{
sample.GetBindingExpression(TextBlock.VisibilityProperty).UpdateTarget();
}
但如果您使用的是定时器反正那么你真的应该考虑是否你应该只是把计时器在你的视图模型,并用它来触发PropertyChanged事件。在我看来,这种细节(即投票服务的适当频率)应该在ViewModel中,而不是View中。
谢谢你这个答案,顺便说一句,UWP没有DispatcherTimer对象,但我会尝试沿着这些线尝试一些事情。 – Anss
你试过吗INotifyPropertyChanged(namespace System.ComponentModel)event?
event PropertyChangedEventHandler PropertyChanged;
public Visibility JobStatus
{
get
{
if(SponsorReferralUploadService.IsRunning())
return Visibililty.Collapsed;
else
return Visibililty.Visible;
}
}
,如果你确实使用Caliburn.Micro然后INPC已经纳入使用NotifyOfPropertyChanged(() => JobStatus);
需要的框架被称为当过你的SponsorReferralUploadService
检测到变化。
这里最棘手的部分是它是如何得到这个消息,如果SponsorReferralUploadService
是一个周期性的服务,那么你还需要沿着EventAggregator
(也许)线的东西把它发布的变化,并有IHandle
实际上使该属性根据发布的消息进行更新,即实际致电NotifyOfPropertyChanged(() => JobStatus)
。将EventAggregator
想象成一个交叉视图模型消息泵,消失并忘记,考虑到这一点,不能保证消息传递,通常与视图模型生命周期有关。
这个吸气器实际上是一个很大的方法,只需要一行代码和一个内置在BooleanToVisibilityConverter
转换器中的转换器。
public bool JobStatus
{
get{
return SponsorReferralUploadService.IsRunning();
}
}
然后指示Textbox
会变成这个 <TextBox Name="Sample" Visibility="{Binding JobStatus, Convert={StaticResource BoolVis}}" />
<Page.Resources> <cal:BooleanToVisibilityConverter x:Key="BoolVis" /> </Page.Resources>
当然关于得到更新Blurb的还是身高约谁的财产变化来电或支票。
对于小型应用程序使用mvermef表示财产代码或以其他方式使用此。
对于大的应用程序使用这个布尔转换器,这将帮助你获得更多的属性。
<TextBox Name="sample" Visibility="{Binding JobStatus,Converter={staticResource BooleanToVisibilityConverter}" />
public class BooleanToVisibilityConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return (bool)value ? Visibility.Visible : Visibility.Collapsed;
}
}
可能我不完全理解问题是什么,但不是执行INotifyProperty做你想做的? – RTDev
布尔值来自服务层,我不可能重写/重新设计所有代码。对不起,我跳过了那部分。 – Anss
您的服务是否发送事件以便您可以获知其状态通知?如果是的话,那么你可以钩住这些事件并适当地触发'NotifyOfPropertyChanged(nameof(JobStatus))'。如果没有,那么你可以使用定时器并从那里触发它。 – Doom5