WPF DataContext数据不刷新问题

qq_15197419 2019-11-08 10:54:44

如上图,红框是frame控件,蓝框是用户控件



给设的默认值是能正常显示的。表示已经绑定成功了。我现在MainWindoe用DataContext修改黄框lable的数据,结果lable没改变。打断点调试,正常运行到了OnPropertyChanged("real_force");。
MainWindow下:
private void button_Click(object sender, RoutedEventArgs e)
{
MainViewModel vm = DataContext as MainViewModel;
vm.real_force = 5;
}


MainViewModel类:
class MainViewModel: INotifyPropertyChanged
{
#region INPC
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(string propertyName) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
#endregion

public int _real_force=55;
public int real_force
{
get
{
return _real_force;
}
set
{
_real_force = value;
OnPropertyChanged("real_force");
}

}
}

请问下是什么原因啊?WPF小白真的搞懵逼了,为了实时刷新用户控件这个数据弄了两天了~就是死活不刷新。
...全文
1085 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
u011271924 2019-11-08
  • 打赏
  • 举报
回复
最外的加上DataContext = {Bing}试试
qq_15197419 2019-11-08
  • 打赏
  • 举报
回复
引用 3 楼 Nick_Ngai 的回复:
不知道你怎么绑定的。我这样写是可以的。
cs如下:
MainViewModel mainVM = new MainViewModel();

public MainWindow()
{
InitializeComponent();

this.DataContext = mainVM;
}

private void BtnTest_Click(object sender, RoutedEventArgs e)
{
mainVM.real_force = 5;
}
}

class MainViewModel : INotifyPropertyChanged
{
#region INPC
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(string propertyName) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
#endregion

public int _real_force = 55;
public int real_force
{
get
{
return _real_force;
}
set
{
_real_force = value;
OnPropertyChanged("real_force");
}

}
}

XAML不变。

按照你写的,也还是不刷新,我不知道是不是因为子页面是frame加载的原因~先不说修改子页面使用的用户控件,就算直接改子页面上的数据也还是不刷新
Nick_Ngai 2019-11-08
  • 打赏
  • 举报
回复
不知道你怎么绑定的。我这样写是可以的。 cs如下: MainViewModel mainVM = new MainViewModel(); public MainWindow() { InitializeComponent(); this.DataContext = mainVM; } private void BtnTest_Click(object sender, RoutedEventArgs e) { mainVM.real_force = 5; } } class MainViewModel : INotifyPropertyChanged { #region INPC public event PropertyChangedEventHandler PropertyChanged; public void OnPropertyChanged(string propertyName) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); #endregion public int _real_force = 55; public int real_force { get { return _real_force; } set { _real_force = value; OnPropertyChanged("real_force"); } } } XAML不变。
qq_15197419 2019-11-08
  • 打赏
  • 举报
回复
引用 1 楼 Nick_Ngai 的回复:
{Binding real_force,UpdateSourceTrigger=PropertyChanged}加上这个UpdateSourceTrigger=PropertyChanged

还是不刷新~
Nick_Ngai 2019-11-08
  • 打赏
  • 举报
回复
{Binding real_force,UpdateSourceTrigger=PropertyChanged}加上这个UpdateSourceTrigger=PropertyChanged
qq_15197419 2019-11-08
  • 打赏
  • 举报
回复
感谢各位,问题解决了。WPF真是让人头大。
感谢各位指导~
qq_15197419 2019-11-08
  • 打赏
  • 举报
回复
引用 11 楼 qq_15197419 的回复:
[quote=引用 10 楼 Nick_Ngai 的回复:]
把用户控件放到一个列表中,绑定列表数据,这样每个控件绑定的值不就不同了,这样行吗?
如下:
<ItemsControl ItemsSource="{Binding XXXList}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<WrapPanel>
<local:dataItem DataContent="{Binding XXX}"/>
</WrapPanel>
</ItemsControl.ItemTemplate>
</ItemsControl>


ItemsControl不熟悉。弄了下,ItemsControl绑定list没问题,关键是下面用户控件怎么分别绑定就不懂了。

刚刚试了下后台代码绑定
dataItem3 = new dataItem(personList, bagWeight3,3);
dataItem3.DataContext = new MainViewModel();
dataItem3.lable_realForce.SetBinding(Label.ContentProperty,new Binding("real_force") { });
dataItems.Children.Add(dataItem3);
这样可以绑定上去,也就是可以把不同用户控件分开绑定了,可是问题是这样做跟之前一样,没法刷新
应该是dataItem3.DataContext = new MainViewModel();这句代码没有实现UI界面添加控件时的DataContext={binding}。但是查了下资料也没找到这里的准确写法~
[/quote]

找到原因了,这里是子页面绑定的MainViewModel和父页面修改的MainViewModel不是同一个示例。页面创建时把父页面的MainViewModel传过来就能正常刷新了
qq_15197419 2019-11-08
  • 打赏
  • 举报
回复
引用 10 楼 Nick_Ngai 的回复:
把用户控件放到一个列表中,绑定列表数据,这样每个控件绑定的值不就不同了,这样行吗?
如下:
<ItemsControl ItemsSource="{Binding XXXList}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<WrapPanel>
<local:dataItem DataContent="{Binding XXX}"/>
</WrapPanel>
</ItemsControl.ItemTemplate>
</ItemsControl>


ItemsControl不熟悉。弄了下,ItemsControl绑定list没问题,关键是下面用户控件怎么分别绑定就不懂了。

刚刚试了下后台代码绑定
dataItem3 = new dataItem(personList, bagWeight3,3);
dataItem3.DataContext = new MainViewModel();
dataItem3.lable_realForce.SetBinding(Label.ContentProperty,new Binding("real_force") { });
dataItems.Children.Add(dataItem3);
这样可以绑定上去,也就是可以把不同用户控件分开绑定了,可是问题是这样做跟之前一样,没法刷新
应该是dataItem3.DataContext = new MainViewModel();这句代码没有实现UI界面添加控件时的DataContext={binding}。但是查了下资料也没找到这里的准确写法~
Nick_Ngai 2019-11-08
  • 打赏
  • 举报
回复
把用户控件放到一个列表中,绑定列表数据,这样每个控件绑定的值不就不同了,这样行吗? 如下: <ItemsControl ItemsSource="{Binding XXXList}"> <ItemsControl.ItemTemplate> <DataTemplate> <WrapPanel> <local:dataItem DataContent="{Binding XXX}"/> </WrapPanel> </ItemsControl.ItemTemplate> </ItemsControl>
qq_15197419 2019-11-08
  • 打赏
  • 举报
回复
或者说能不能后台加载用户控件时实现分别绑定?
qq_15197419 2019-11-08
  • 打赏
  • 举报
回复

找到原因了,子页面调用用户控件时需要添加,怪我没截图这里的代码~
但是新的问题出来了。
他们两个是同一个用户控,绑定的同一个数据,改变real_force。这两个用户控件会一起跟着变,我需要判断数据分别刷新数据~
头大啊,怎么区分开?
Nick_Ngai 2019-11-08
  • 打赏
  • 举报
回复
建议注释掉一些繁琐的功能,比如用户控件之类,试成功后,再一点一点恢复注释掉的功能,排查问题。
Nick_Ngai 2019-11-08
  • 打赏
  • 举报
回复
试了下在frame子页面中还是可以,不知道你那是什么原因了

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧