C# 从datacontext更新标签

C# 从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

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.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();