Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实时更新XAML组件可见性-UWP_C#_Xaml_Uwp_Caliburn.micro_Uwp Xaml - Fatal编程技术网

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

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接口 当我打开此页面时,文本框的可见性被设置为布尔值是真是假,我如何编程使布尔值一经更新,可见性属性就发生更改?您是否尝试过

我有一个周期性线程在我的UWP应用程序的后台运行,我想将某些组件的可见性与其执行联系起来。我使用caliburn并像这样绑定组件:

<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