从datacontext更新标签

时间:2011-03-24 07:47:44

标签: 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.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>

StatusViewModel .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; }
    }
}

Status.cs

public class Status : ViewModelBase
    {
        private string _message;
        public string Message
        {
            get { return _message; }
            set
            {
                if (_message == value) return;
                _message = value;
                OnPropertyChanged("Message");
            }
            }
        }

在主窗口中,我集成了视图usercontrol,提供了dataContext

MainWindow.xaml.cs

         if (!DesignerProperties.GetIsInDesignMode(this))
        {
            StatusViewModel statusModel = new StatusViewModel(controller);
            this.StatusView.DataContext = statusModel;
        }

现在我的问题是:为什么我看到这个绑定错误? 错误是:BindingExpression path error: 'Message' property not found on 'object' ''StatusViewModel' (HashCode=44528608)'. BindingExpression:Path=Message; DataItem='StatusViewModel' (HashCode=44528608); target element is 'Label' (Name=''); target property is 'Content' (type 'Object')

6 个答案:

答案 0 :(得分:1)

这里有很多东西,还有一些很好的回应。如前所述,第一个问题是您的DataContext对象类型没有定义名为Message的属性。

第二个问题是您正在尝试使用ObservableCollection中的单个属性。您打算如何知道Label应该绑定到哪个项目?

我有第三个问题:你为什么要使用Label? WPF / SL中的标签与WinForms和WebForms中的标签不同。它们是围绕TextBlock的重量级包装器,它为目标字段提供键盘方向性(换句话说,如果Label是FirstName,您可以使用键盘转到相关的FirstNameTextBox)。如果您只想在屏幕上显示只读文本,请改用TextBlock。

答案 1 :(得分:0)

如果您遵循MVVM模式,您应该能够将标签绑定到viewmodel集合中的项目数。

答案 2 :(得分:0)

如果你做mvvm,你有loaddata命令填充你的集合(它绑定到你的gridview)。所以你现在要做的就是创建第二个属性“Itemsnumber”或者其他什么,并将它设置为collection.count属性。您在loadcommand中执行此操作。如果你正确实现了INotifyPropertyChangeed并且绑定正确,你会看到你的标签更新。

编辑:SelectedItems 如果您需要vm中的选择项,那么您应该谷歌搜索“SeletedItems MVVM”,那里有很多可能的解决方案(AttachedProperties,Behaviors,MultiSelectControls ......)

如果你只想在你的ui上显示标签,只需使用selectionchanged事件。

    private void MyGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        this.MySelectedItemsTextBlock.Text = this.MyGrid.SelectedItems.Count;
    }

编辑:这个问题完全改变了,所以请忽略我的问题:)

答案 3 :(得分:0)

从您提供的代码看起来,您正在绑定错误的类。您的Status类具有Message属性,但您将DataContext设置为StatusViewModel类型的对象,该对象没有Message属性。然后,您将标签绑定到不存在的Message属性。将DataContext设置为Status对象或在StatusViewModel中显示所需的状态。

答案 4 :(得分:0)

您的班级Message上有属性Status,但不是您的班级StatusViewModel

您可以将该属性添加到StatusViewModel,将StatusView.DataContext更改为Status或将绑定更改为:

<Label Content="{Binding ProjectStatus.Message}">

您绑定到属性的属性。

答案 5 :(得分:0)

你的问题并不完全清楚。我希望您知道GridGridView不同,并且不是项目网格。

如果您要显示状态列表,那么您将执行以下操作:

<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>

现在只需将列表框的DataContent设置为ProjectStatus类的实例即可。它应该工作。

myList.DataContext = new StatusViewModel();