未提示绑定失败但前台没有显示

WPF数据绑定不更新
MV里的数据会正常更新,但是并没有表现在WPF的界面上,不知道问题出在哪里

这是XAML

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <Label Content="ABC" Foreground="{Binding LJogState}" FontSize="100"/>
    </Grid>

这是xaml.cs

    public partial class Function : UserControl
    {
        public Function()
        {
            InitializeComponent();
            DataContext = new FunctionViewModel(this);
        }
    }

这是MV

    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;

        private void DeviceStateUpdata()
        {
                LJogState = a ? Brushes.Red : Brushes.Green;
        }
    }

打断点以后能看到后台有数据送进来

img

界面也没有绑定失败报错,但是后台数据就是没有体现出来

img

试了很多种方法都没找到原因,是哪里少东西了吗?

【相关推荐】



  • 关于该问题,我找了一篇非常好的博客,你可以看看是否有帮助,链接:WPF 基础(十四) 资源字典——程序集之间的xaml资源共享
  • 您还可以看一下 赵庆明老师的WPF疑难解惑(1)课程中的 如何在XAML代码中添加C#代码小节, 巩固相关知识点
  • 除此之外, 这篇博客: 初识WPF-数据绑定中的 3.1 在XAML元素上进行的绑定 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:

    这里对TextBlock 的属性Text进行数据绑定,这个属性通过Binding标记扩展来设置。在Binding标记扩展中,把ElementName设置为tb1,以引用TextBox控件,把Path属性设置为Text,从Text属性中获取文件框tb1的值。

    <Window x:Class="WpfAppLearning1.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:WpfAppLearning1"
            mc:Ignorable="d"
            Title="MainWindow" Height="450" Width="800">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition/>
                <RowDefinition/>
                <RowDefinition/>
            </Grid.RowDefinitions>
            <TextBox x:Name="tb1" Grid.Row="0" TextWrapping="Wrap"></TextBox>
            <TextBox x:Name="tb2" Grid.Row="1"></TextBox>
            <TextBlock  x:Name="textBlock" Grid.Row="3" Text="{Binding Path= Text, ElementName=tb1}" />
        </Grid>
    </Window>
    
    

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

根据你提供的代码和描述,数据没有更新到界面上可能是因为没有通知WPF界面去更新。在WPF中,要想在数据发生变化时及时更新UI,需要使用实现了INotifyPropertyChanged接口的类,并在属性值发生变化时触发属性更改事件。

确保满足以下几个步骤:

  1. 确保 FunctionViewModel 类继承了 INotifyPropertyChanged 接口,并实现了该接口的 PropertyChanged 事件。

  2. FunctionViewModel 类中的属性 LJogState 上触发 PropertyChanged 事件,以通知界面更新。例如,在 LJogState 的属性访问器中添加 OnPropertyChanged(nameof(LJogState))

  3. 在 XAML 中的 LabelForeground 属性上使用 {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 属性的值发生变化时,会触发属性更改事件,在界面上及时更新对应的绑定。

希望这能帮助到你解决问题。如果还有其他疑问,请随时提问。