C# 实时更新XAML组件可见性-UWP
我有一个周期性线程在我的UWP应用程序的后台运行,我想将某些组件的可见性与其执行联系起来。我使用caliburn并像这样绑定组件:C# 实时更新XAML组件可见性-UWP,c#,xaml,uwp,caliburn.micro,uwp-xaml,C#,Xaml,Uwp,Caliburn.micro,Uwp Xaml,我有一个周期性线程在我的UWP应用程序的后台运行,我想将某些组件的可见性与其执行联系起来。我使用caliburn并像这样绑定组件: <TextBox Name="sample" Visibility="{Binding JobStatus}" /> 此布尔值来自应用程序的服务层,因此我无法重写/重新设计所有代码并实现INotifyPropertyChanged接口 当我打开此页面时,文本框的可见性被设置为布尔值是真是假,我如何编程使布尔值一经更新,可见性属性就发生更改?您是否尝试过
<TextBox Name="sample" Visibility="{Binding JobStatus}" />
此布尔值来自应用程序的服务层,因此我无法重写/重新设计所有代码并实现INotifyPropertyChanged
接口
当我打开此页面时,
文本框的可见性
被设置为布尔值是真是假,我如何编程使布尔值一经更新,可见性
属性就发生更改?您是否尝试过INotifyPropertyChanged(命名空间System.ComponentModel)事件
事件属性ChangedEventHandler属性Changed
您是否尝试过INotifyPropertyChanged(命名空间系统.ComponentModel)事件
事件属性ChangedEventHandler属性Changed
为了澄清这一点,WPF中的数据绑定不会持续重新评估。一旦UI获得JobStatus属性的值,它就不会再次询问。除非,也就是说,您告诉它
更常见的方法是在ViewModel上实现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();
}
<>但是如果你使用计时器,那么你应该考虑是否应该把定时器放在你的VIEW模型中,并使用它来触发属性更改事件。在我看来,这种细节(即一个合适的轮询服务频率)。应该在ViewModel中,而不是视图中。为了澄清,WPF中的数据绑定不会持续重新评估。一旦UI获得JobStatus属性的值,它就不会再次询问。除非您告诉它
public Visibility JobStatus
{
get
{
if(SponsorReferralUploadService.IsRunning())
return Visibililty.Collapsed;
else
return Visibililty.Visible;
}
}
更常见的方法是在ViewModel上实现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();
}
但是,如果你使用计时器,那么你应该考虑是否应该把定时器放在你的VIEW模型中,并使用它来触发属性更改事件。在我看来,这种细节(即一个合适的轮询服务频率)应该在VIEW模型中而不是视图。
public Visibility JobStatus
{
get
{
if(SponsorReferralUploadService.IsRunning())
return Visibililty.Collapsed;
else
return Visibililty.Visible;
}
}
如果您确实在使用Caliburn.Micro,那么INPC已经使用NotifyOfPropertyChanged(()=>JobStatus)集成到框架中;当SponsorReferralUploadService
检测到更改时,需要调用
这里棘手的部分是它是如何获得此消息的如果赞助商ReferralUploadService
是一项定期服务,那么您还需要类似于事件聚合器的内容(可能)要让它发布更改并让IHandle
根据发布的消息实际更新属性,即实际调用NotifyOfPropertyChanged(()=>JobStatus)
。将EventAggregator
想象成一个cross-viewmodel消息泵,点燃并忘记,记住,通常与viewmodel生命周期相关的消息传递没有保证
这个getter实际上非常大,只需要一行代码和一个内置在BooleanToVisibilityConverter
转换器中的转换器
public bool JobStatus
{
get{
return SponsorReferralUploadService.IsRunning();
}
}
然后,如图所示,Textbox
将变为
当然,关于获取更新的宣传语仍然是关于谁打电话或检查属性更改的
如果您确实在使用Caliburn.Micro,那么INPC已经使用NotifyOfPropertyChanged(()=>JobStatus)集成到框架中;当SponsorReferralUploadService
检测到更改时,需要调用
这里棘手的部分是它是如何获得此消息的如果赞助商ReferralUploadService
是一项定期服务,那么您还需要类似于事件聚合器的内容(可能)要让它发布更改并让IHandle
根据发布的消息实际更新属性,即实际调用NotifyOfPropertyChanged(()=>JobStatus)
。将EventAggregator
想象成一个cross-viewmodel消息泵,点燃并忘记,记住,通常与viewmodel生命周期相关的消息传递没有保证
这个getter实际上非常大,只需要一行代码和一个内置在BooleanToVisibilityConverter
转换器中的转换器
public bool JobStatus
{
get{
return SponsorReferralUploadService.IsRunning();
}
}
然后,如图所示,Textbox
将变为
当然,关于获取更新的宣传语仍然是关于谁调用或检查属性更改。对于小型应用程序,请使用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;
}
}
公共类BooleanToVisibilityConverter:IValueConverter
{
公共对象转换(对象值、类型targetType、对象参数、System.Globalization.CultureInfo区域性)
{
返回(bool)值?可见性。可见:可见性。折叠;
}
}
适用于s