Обновить метку из datacontext - PullRequest
0 голосов
/ 24 марта 2011

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

Статус.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 ]

1 голос
/ 24 марта 2011

Здесь много чего происходит и уже есть хорошие отзывы. Как было сказано ранее, первая проблема заключается в том, что тип объекта DataContext не определяет свойство с именем Message.

Вторая проблема заключается в том, что вы пытаетесь использовать одно свойство из ObservableCollection. Как вы собираетесь, чтобы лейбл знал, к какому элементу в коллекции он должен быть привязан?

У меня есть третья проблема: почему вы используете ярлык? Метки в WPF / SL отличаются от WinForms и WebForms. Они представляют собой плотные обертки вокруг TextBlock, которые обеспечивают направление клавиатуры к целевому полю (другими словами, если Label был FirstName, вы могли бы использовать клавиатуру для перехода к связанному FirstNameTextBox). Если все, что вы хотите сделать, это отобразить текст на экране только для чтения, используйте вместо него TextBlock.

0 голосов
/ 24 марта 2011

Твой вопрос не совсем понятен.Я надеюсь, вы знаете, что 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();
0 голосов
/ 24 марта 2011

У вас есть свойство Message в вашем классе Status, но нет вашего класса StatusViewModel.

Вы можете добавить свойство к StatusViewModel, изменить StatusView.DataContext на Status или изменить привязку на:

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

, где вы привязываетесь к свойству собственности.

0 голосов
/ 24 марта 2011

Из кода, который вы создали, похоже, что вы связываетесь не с тем классом. У вашего класса Status есть свойство Message, но вы устанавливаете свой DataContext для объекта типа StatusViewModel, у которого нет свойства Message. Затем вы привязываете метку к свойству Message, которого не существует. Либо установите свой DataContext для объекта Status, либо отобразите статус, который вы хотите, в вашей StatusViewModel.

0 голосов
/ 24 марта 2011

если вы делаете mvvm, у вас есть команда loaddata, в которой вы заполняете свою коллекцию (которая привязана к вашему gridview). поэтому все, что вам нужно сделать сейчас, это создать второе свойство Itemsnumber или что-то еще и установить его в свойстве collection.count. Вы делаете все это в своей команде load. если вы правильно внедрили INotifyPropertyChangeed и ваша привязка верна, вы увидите, что ваш ярлык обновлен.

Редактировать: SelectedItems если вам нужны выбранные элементы в вашей виртуальной машине, то вам следует поискать «SeletedItems MVVM» в Google. Существует множество возможных решений (AttachedProperties, Behaviors, MultiSelectControls ...)

Если вы просто хотите отобразить ярлык на вашем пользовательском интерфейсе, просто используйте событие selectedchanged.

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

РЕДАКТИРОВАТЬ: этот вопрос полностью меняется, поэтому игнорируйте мой ответ на ваш новый вопрос:)

0 голосов
/ 24 марта 2011

Если вы следуете шаблону MVVM, вы сможете привязать метку к числу элементов в коллекции вашей модели представления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...