Binding и INotifyPropertyChanged - PullRequest
       2

Binding и INotifyPropertyChanged

1 голос
/ 08 декабря 2011

Я пытаюсь связать TextBlock с помощью события INotifyPropertyChanged.Но это ничего не обновляет до TextBlock.TextBlock пусто.Моя цель - обновить статус элементов, которые отображаются в разных строках.Мне нужно обновить текст и цвет TextBlock в зависимости от статуса.

Может кто-нибудь сказать мне, что не так с моим кодом?

public class ItemStatus : INotifyPropertyChanged
{
    string itemStatus;
    Brush itemStatusColor;

    public string ItemStatus
    {
        get { return itemStatus; }
        set
        {
            itemStatus = value;
            this.OnPropertyChanged("ItemStatus");
        }
    }

    public Brush ItemStatusColor
    {
        get { return itemStatusColor; }
        set
        {
            itemStatusColor = value;
            this.OnPropertyChanged("ItemStatusColor");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    void OnPropertyChanged(string propName)
    {
        if (this.PropertyChanged != null)
            this.PropertyChanged(
                this, new PropertyChangedEventArgs(propName));
    }
}

public class Items
{
    List<ItemStatus> currentItemStatus;

    public List<ItemStatus> CurrentItemStatus
    {
        get { return currentItemStatus; }
        set { currentItemStatus = value; }
    }
}

public partial class DisplayItemStatus : Page
{
    ....
    ....

    public DisplayItemStatus()
    {
        foreach (Product product in lstProductList)
        {
            TextBlock tbItemStatus = new TextBlock();
            ....

            Items objItems = new Items();

            Binding bindingText = new Binding();
            bindingText.Source = objItems;
            bindingText.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
            bindingText.Path = new PropertyPath(String.Format("ItemStatus"));
            tbItemStatus.SetBinding(TextBlock.TextProperty, bindingText);

            Binding bindingColor = new Binding();
            bindingColor.Source = objItems;
            bindingColor.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
            bindingColor.Path = new PropertyPath(String.Format("ItemStatusColor"));
            tbItemStatus.SetBinding(TextBlock.ForegroundProperty, bindingColor);

            grdItemsList.Children.Add(tbItemStatus);
        }
    }

    private void UpdateItems_Click(object sender, MouseButtonEventArgs e)
    {
        int intCount = 0;

        List<Product> ProductList = new List<Product>();
        List<ItemStatus> ItemList = new List<ItemStatus>();

        ProductList = GetProducts();
        foreach (Product product in ProductList)
        {
            intCount++;
            UpdateStatus(intCount, ItemList);
        }
    }

    public void UpdateStatus(int intIndex, List<ItemStatus> ItemList)
    {
        ItemStatus status = new ItemStatus();
        status.ItemStatus = strOperationStatus;
        status.ItemStatusColor = brshForegroundColor;
        ItemList.Add(status);
    }
}

1 Ответ

2 голосов
/ 08 декабря 2011

Что ж, особая проблема здесь в том, что вы привязываете TextBlock к Item, а не к ItemStatus. Но вы также делаете сложные вещи, вы действительно должны сделать детали связывания в XAML. Предоставьте коллекцию ItemStatus из вашей модели представления и имейте ListBox или что-то с его ItemsSource, связанным с коллекцией. Затем вам понадобится DataTemplate, который определяет TextBlock и привязки к ItemStatus.

Вот хорошее пошаговое руководство для него в целом

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