【发布时间】: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