WPF DataContext已更新,但UI未更新
我有最简单的应用程序。我想在按下按钮时填充列表框。我使用绑定,窗口DataContext在一些操作后更新,但UI没有更新 代码如下: MainWindow.xaml ViewModel.csWPF DataContext已更新,但UI未更新,wpf,user-interface,binding,datacontext,Wpf,User Interface,Binding,Datacontext,我有最简单的应用程序。我想在按下按钮时填充列表框。我使用绑定,窗口DataContext在一些操作后更新,但UI没有更新 代码如下: MainWindow.xaml ViewModel.cs 您需要支持属性更改通知。使用NuGet软件包管理器引用MVVM Lite项目,从ViewModelBase派生ViewModel,然后将链接属性更改为: private string _link; { public string link { get {return this
您需要支持属性更改通知。使用NuGet软件包管理器引用MVVM Lite项目,从ViewModelBase派生ViewModel,然后将链接属性更改为:
private string _link;
{
public string link
{
get {return this._link;}
set {this._link=value; RaisePropertyChanged(() => this.link); }
}
}
您还需要为URL属性执行此操作,该属性必须是公共的,以便绑定工作。我也知道这有点超出了问题的范围,但一般来说,不应该像这样使用单击处理程序,正确的方法是向ViewModel添加一个RelayCommand,并将按钮的Command属性绑定到该属性。问题源于ViewModel类中的URL属性。您需要公开URL,否则主窗口无法访问属性:
视图模型:
希望这有帮助,让我知道如果你有任何问题 ObservationCollection已经有一个RaisePropertyChanged事件和CollectionChanged事件。@Dom true,但这只会通知他向集合中添加或从集合中删除的项。如果他想更改集合本身或任何项中的字段,那么他需要为其他项实现INotifyPropertyChanged行为。诚然,我的回答可能有点超出了他的具体问题,但在我的辩护中,我也提到了他需要公开收集财产,以便约束工作。
namespace WpfApplication1
{
public partial class MainWindow : Window
{
ViewModel model = new ViewModel();
public MainWindow()
{
InitializeComponent();
this.DataContext = model;
}
private void Button_Click(object sender, RoutedEventArgs e)
{
model.GetUrls();
}
}
}
namespace WpfApplication1
{
class ViewModel
{
private ObservableCollection<Url> Urls { get; set; }
public ViewModel()
{
Urls = new ObservableCollection<Url>();
}
public void GetUrls()
{
for (int i = 0; i < 5; i++)
{
Urls.Add(new Url { link = i.ToString() });
}
}
}
public class Url
{
public string link { get; set; }
}
}
private string _link;
{
public string link
{
get {return this._link;}
set {this._link=value; RaisePropertyChanged(() => this.link); }
}
}
namespace WpfApplication1
{
public class ViewModel
{
//make this public otherwise MainWindow will not have access to it!
public ObservableCollection<Url> Urls { get; set; }
public ViewModel()
{
Urls = new ObservableCollection<Url>();
}
public void GetUrls()
{
for (int i = 0; i < 5; i++)
{
Urls.Add(new Url { link = i.ToString() });
}
}
}
public class Url
{
public string link { get; set; }
}
}