【问题标题】:data doesn't update on all bindings数据不会在所有绑定上更新
【发布时间】:2019-12-16 21:07:29
【问题描述】:

我有两个窗口,我的 MainWindow 和一个 CounterWindow; MainWindow 上是一个带有绑定的按钮,而我的 CounterWindow 上是一个具有相同绑定的标签

检索数据时,Button 确实接收到新数据,但 CounterWindow 标签不会更新。

注意,它在初始化时变为 0(所以绑定函数!(?))

    public class CounterModel : INotifyPropertyChanged
    {
        public string CurrentCount {
            get { return mCurrentCount; }
            set
            {
                if (value == mCurrentCount) return;
                mCurrentCount = value;
                OnPropertyChanged();
            }

        }

        public CounterModel() {
            UpdateCounters();
        }

        public event PropertyChangedEventHandler PropertyChanged;

        void OnPropertyChanged([CallerMemberName]string propertyName = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }

        string mCurrentCount;

        public void UpdateCounters(int i = 0)
        {
            CurrentCount = i.ToString();
        }

    }
}

MainWindow 代码隐藏:

        public MainWindow()
        {
            InitializeComponent();
            CounterBtn.DataContext = cntMdl;
        }

        CounterModel cntMdl = new CounterModel();

CounterWindow 代码隐藏:

        public CounterWindow()
        {
            InitializeComponent();
            DataContext = new CounterModel();
        }

CounterWindow Xaml

<TextBlock Text="{Binding CurrentCount}" FontSize="900" HorizontalAlignment="Center" VerticalAlignment="Center" FontFamily="Consolas" Foreground="White" MouseDown="TextBlock_MouseDown"/>

我错过了什么?

【问题讨论】:

  • CounterBtn.DataContext = cntMdl;CounterModel cntMdl = new CounterModel(); 之前被调用,所以它将是null。除此之外,您根本不应该创建新的 CounterModel。对两个窗口使用唯一的实例。
  • 你分配单个控件的DataContext也很奇怪,比如CounterBtn。您通常会在窗口级别分配它,窗口中的控件将继承它。
  • 我只希望该按钮具有特定的数据上下文,窗口的其余部分将具有不同的上下文我无法在不使用 cntMdl 的情况下调用 UpdateCounters() .. 恐怕有什么我我在某处做错了,但我看不到在哪里
  • p.s.,它工作的原因是因为我剥离了一些代码; CounterModel cntMdl = new CounterModel(); 是在任何 void 之外声明的变量; CounterBtn.DataContext = cntMdl; 是在 public MainWindow() 中声明的
  • Hmm.. 是不是因为我用new CounterModel(); ?...我如何重用已经存在的那个?

标签: c# wpf data-binding


【解决方案1】:

不要为 CounterWindow 创建新的 CounterModel 实例。删除

DataContext = new CounterModel();

来自 CounterWindow 构造函数。

如果您从 Button 的 Click 事件处理程序中显示 CounterWindow,请将当前 DataContext 传递给新窗口:

private void Button_Click(object sender, RoutedEventArgs e)
{
    var button = (Button)sender;
    var window = new CounterWindow { DataContext = button.DataContext };
    window.Show();
}

【讨论】:

  • CounterModel cntMdl = new CounterModel(); CounterWindow CounterWindow = new CounterWindow { DataContext = cntMdl }; 会抛出 A field initializer cannot reference the nonstatic field, method, or property
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-27
  • 2013-06-15
  • 2014-08-26
相关资源
最近更新 更多