无法将ViewModel与View绑定,请求排查问题
无法将ViewModel与View绑定,请求排查问题
嘿,我看了你的代码,问题其实出在几个容易忽略的小细节上,我帮你梳理下:
你只定义了DataTemplate,但没有在View里放置能渲染ViewModel的控件
你在Grid的Resources里写了对应TestViewModel的DataTemplate,但Grid本身不会自动把ViewModel当作内容来展示。你需要添加一个ContentControl(或者ContentPresenter),让它的Content绑定到ViewModel实例,这样WPF才会自动匹配你定义的DataTemplate来渲染内容。修改后的XAML应该是这样:<Grid> <Grid.Resources> <DataTemplate DataType="{x:Type local:TestViewModel}"> <Label Content="{Binding Wtf}"/> </DataTemplate> </Grid.Resources> <!-- 新增这个控件,用来承载ViewModel --> <ContentControl Content="{Binding}"/> </Grid>你的View还没有和ViewModel实例建立关联
不管之后用不用依赖注入,你得先让View知道它要绑定的ViewModel对象是谁。最简单的方式是在View的构造函数里手动设置DataContext(等用DI的时候再换成注入的实例就行):// 假设你的View是MainWindow,在构造函数里添加这行 public MainWindow() { InitializeComponent(); DataContext = new TestViewModel(); }额外提个小建议:实现INotifyPropertyChanged接口
现在你的Wtf是只读属性,暂时不影响显示,但如果之后需要更新属性值并让UI同步变化,就必须实现这个接口。给你的ViewModel加个基础实现:using System.ComponentModel; using System.Runtime.CompilerServices; public class TestViewModel : INotifyPropertyChanged { public string Wtf => "wtf???"; public event PropertyChangedEventHandler? PropertyChanged; protected void OnPropertyChanged([CallerMemberName] string? propertyName = null) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } }
按照上面的步骤调整后,你的Binding应该就能正常显示"wtf???"了~
备注:内容来源于stack exchange,提问作者Kirill Reutov
相关产品推荐
相关产品推荐

