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')
答案 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)
你的问题并不完全清楚。我希望您知道Grid
与GridView
不同,并且不是项目网格。
如果您要显示状态列表,那么您将执行以下操作:
<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();