WPF BindingExpression UpdateSource无法正常工作

时间:2017-05-30 19:31:41

标签: wpf

我有一个带有标签的主窗口。

<Label 
    Name="RoundLabel" 
    DataContext="{Binding RelativeSource={RelativeSource Self}}" 
    Content="{Binding Source={x:Static core:Supervisor.Simulator}, Path=Round, UpdateSourceTrigger=Explicit, Mode=TwoWay}"
    />

在代码隐藏中,有一种方法可以更新lablecontent

 public void updateRound()
    {
      BindingExpression binding = RoundLabel.GetBindingExpression(Label.ContentProperty);
        binding.UpdateSource();
    }

在另一课程中,我致电updateRound

public int Round
    {
      get
      {
        return round.Value;
      }
      set
      {
        if (!(round.Value == value))
        {
          round.Value = value;
          App.Current.Dispatcher?.Invoke(() => (App.Current.MainWindow as MainWindow).updateRound());
        }
      }

因此每次圆形更改的值都应在标签中更改。 没有例外,但GUI中的圆形数字不是更新。

我的错误在哪里?什么都错过了?

1 个答案:

答案 0 :(得分:0)

通知WPF通常通过实现INotifyPropertyChanged接口来完成对已更改的源属性值的绑定:

public class Simulator : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private int round;

    public int Round
    {
        get
        {
            return round;
        }
        set
        {
            if (round != value)
            {
                round = value;
                PropertyChanged?.Invoke(
                    this, new PropertyChangedEventArgs(nameof(Round)));
            }
        }
    }
}

现在将Simulator类的一个实例放入窗口的DataContext,然后像这样绑定一个Label Content

<Window ...>
    <Window.DataContext>
        <local:Simulator/>
    </Window.DataContext>
    <Grid>
        <Label Content="{Binding Round}"/>
    </Grid>
</Window>

通过访问DataContext中的对象来设置代码中的属性:

((Simulator)DataContext).Round = 42;