C# 从datacontext更新标签
MyView.xamlC# 从datacontext更新标签,c#,wpf,mvvm,binding,C#,Wpf,Mvvm,Binding,MyView.xaml <UserControl x:Class="CCTrayHelperWPF.View.StatusView" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxml
<UserControl x:Class="CCTrayHelperWPF.View.StatusView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="30" d:DesignWidth="1200">
<Grid >
<Label Content="{Binding Message}">
</Label>
</Grid>
在主窗口中,我集成了视图usercontrol,提供了dataContext
MainWindow.xaml.cs
public class StatusViewModel : ViewModelBase --> this class has inherited INotifyPropertyChanged
{
ObservableCollection<Status> _statusData;
public StatusViewModel()
{
this._statusData = new ObservableCollection<Status>();
}
public ObservableCollection<Status> ProjectStatus
{
get { return _statusData; }
}
}
public class Status : ViewModelBase
{
private string _message;
public string Message
{
get { return _message; }
set
{
if (_message == value) return;
_message = value;
OnPropertyChanged("Message");
}
}
}
if (!DesignerProperties.GetIsInDesignMode(this))
{
StatusViewModel statusModel = new StatusViewModel(controller);
this.StatusView.DataContext = statusModel;
}
现在我的问题是:为什么我会看到这个绑定错误?
错误为:
BindingExpression路径错误:在“对象”“状态视图模型”(HashCode=44528608)上未找到“消息”属性。BindingExpression:Path=Message;DataItem='StatusViewModel'(HashCode=44528608);目标元素为“标签”(名称=“”);目标属性为“Content”(类型为“Object”)
如果遵循MVVM模式,则应该能够将标签绑定到viewmodel集合中的项目数。如果使用MVVM,则可以使用loaddata命令填充集合(绑定到gridview)。因此,您现在所要做的就是创建第二个属性“Itemsnumber”或其他任何属性,并将其设置为collection.count属性。您可以在loadcommand中完成这一切。如果您正确实现inotifypropertychanged并且绑定正确,您将看到标签更新
编辑:选择编辑
如果你的虚拟机中需要selecteditems,那么你应该在谷歌上搜索“selecteditems MVVM”,有很多可能的解决方案(AttachedProperties、Behavior、MultiSelectControls…)
如果您只想在ui上显示标签,只需使用selectionchanged事件
private void MyGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
this.MySelectedItemsTextBlock.Text = this.MyGrid.SelectedItems.Count;
}
编辑:这个问题完全变了,所以请忽略我的新问题答案:)从您提供的代码来看,您似乎绑定到了错误的类。您的Status类具有Message属性,但您正在将DataContext设置为StatusViewModel类型的对象,该对象没有Message属性。然后将标签绑定到不存在的属性消息。将DataContext设置为状态对象或在StatusViewModel中显示所需的状态。您的类上有属性
消息,但类上没有属性StatusViewModel
您可以将属性添加到StatusViewModel
,将StatusView.DataContext
更改为Status
,或将绑定更改为:
<Label Content="{Binding ProjectStatus.Message}">
您在哪里绑定到属性的属性。您的问题并不完全清楚。我希望您知道网格
不同于网格视图
,而不是项目网格
如果您试图显示状态列表,则您将执行以下操作:
<ListBox x:Name="myList" ItemsSource={Binding ProjectStatus}>
<ListBoxItem>
<DataTemplate>
<TextBlock Text="{Binding Message}"></TextBlock></DataTemplate>
//I assume you want a textblock but you can use a label.
</ListBoxItem>
</ListBox>
这里发生了很多事情,已经有了一些很好的回应。如前所述,第一个问题是DataContext对象类型没有定义名为Message的属性
第二个问题是,您试图使用ObservableCollection中的单个属性。您打算如何让标签知道它应该绑定到集合中的哪个项目
我还有第三个担忧:为什么要使用标签?WPF/SL中的标签与WinForms和WebForms中的标签不同。它们是围绕文本块的重量级包装,为目标字段提供键盘方向性(换句话说,如果标签是FirstName,则可以使用键盘转到相关的FirstNameTextBox)。如果您只想在屏幕上显示只读文本,请使用TextBlock。Ya我做到了。但是listview有复选框,我需要显示有多少项,选择了多少个r。我绑定到列出的项目数量,但无法选择项目。嘿,我们可以在xaml中使用LINQ吗?你应该更新你的问题并发布一些代码,因为你的问题和你评论中的问题不一样:)对不起,我不回答不断变化的问题,我拒绝阅读糟糕的拼写和语法(写“and”和“are”有多难?).你的问题与原意完全不同,答案不再有意义,因为它们回答了两个不同的问题。我投票决定结束,但我认为如果你想得到答案,你应该分别回答你的两个问题。。。起初,我并没有以正确的方式发布问题您的StatusViewModel并没有属性消息,这就是为什么您会出现这个错误。是的,我在StatusViewModel中,在事件中所做的。我的意思是当所有扫描完成后,它会被装订起来。由于篇幅太长,我没有把它放在我的问题中
myList.DataContext = new StatusViewModel();