根据你提供的代码和描述,数据没有更新到界面上可能是因为没有通知WPF界面去更新。在WPF中,要想在数据发生变化时及时更新UI,需要使用实现了INotifyPropertyChanged
接口的类,并在属性值发生变化时触发属性更改事件。
确保满足以下几个步骤:
确保 FunctionViewModel
类继承了 INotifyPropertyChanged
接口,并实现了该接口的 PropertyChanged
事件。
在 FunctionViewModel
类中的属性 LJogState
上触发 PropertyChanged
事件,以通知界面更新。例如,在 LJogState
的属性访问器中添加 OnPropertyChanged(nameof(LJogState))
。
在 XAML 中的 Label
的 Foreground
属性上使用 {Binding LJogState, Mode=OneWay}
进行数据绑定,并将 DataContext
设置为 FunctionViewModel
的实例。
修改后的代码如下所示:
public partial class FunctionViewModel : ObservableObject
{
public Function obj;
public bool a = false;
public FunctionViewModel(Function function)
{
obj = function;
Task.Run(() =>
{
while (true)
{
DeviceStateUpdata();
Thread.Sleep(300);
}
});
}
[ObservableProperty]
private Brush? lJogState;
public Brush? LJogState
{
get { return lJogState; }
set
{
if (lJogState != value)
{
lJogState = value;
OnPropertyChanged(nameof(LJogState));
}
}
}
private void DeviceStateUpdata()
{
LJogState = a ? Brushes.Red : Brushes.Green;
}
}
在 XAML 中的 Label
的代码保持不变:
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Label Content="ABC" Foreground="{Binding LJogState, Mode=OneWay}" FontSize="100"/>
</Grid>
这样,当 LJogState
属性的值发生变化时,会触发属性更改事件,在界面上及时更新对应的绑定。
希望这能帮助到你解决问题。如果还有其他疑问,请随时提问。