实时更新XAML组件的可见性 - UWP

实时更新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接口。

当我打开这个网页时,TextBoxVisibility设置布尔是真还是假的,我怎么能的方式,只要布尔值更新时,Visibility属性更改设定此?

+0

可能我不完全理解问题是什么,但不是执行INotifyProperty做你想做的? – RTDev

+0

布尔值来自服务层,我不可能重写/重新设计所有代码。对不起,我跳过了那部分。 – Anss

+0

您的服务是否发送事件以便您可以获知其状态通知?如果是的话,那么你可以钩住这些事件并适当地触发'NotifyOfPropertyChanged(nameof(JobStatus))'。如果没有,那么你可以使用定时器并从那里触发它。 – Doom5

为了澄清,在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中。

+0

谢谢你这个答案,顺便说一句,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; 
    } 
}