将List中的imageSource属性更改绑定在列表

时间:2015-10-07 14:15:09

标签: c# wpf data-binding listbox

考虑一个包含自定义对象的列表框(让我们称之为“项目”),这些对象又包含List<T>个对象(让我们称之为“选项”)。我想在listbox中的每个项目上显示标记图像,这基本上表示“项目的所有选项都已设置”。

项目的布局在dataTemplate的{​​{1}}中定义。基本上有一条线:

xaml

将图像源绑定到对象

中前面提到的选项列表

转换器定义如下:

<Image Source="{Binding options, Converter={StaticResource conv}, UpdateSourceTrigger=LostFocus}"/>

最后在选项定义中

using Project.Model.Option;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Windows.Data;
using System.Windows.Media.Imaging;

namespace Project.ViewModel.Converter
{
    class cStatusImageConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value != null)
            {
                BitmapImage failImage = new BitmapImage();
                failImage.BeginInit();
                failImage.UriSource = new Uri("pack://application:,,,/view/Icons/failImage.png");
                failImage.EndInit();

                List<cOption> options = (List<cOption>)value;

                for (int i = 0; i < options.Count; i ++)
                {
                    if (options[i].value == null)
                        return failImage;
                }

                BitmapImage successImage = new BitmapImage();
                successImage.BeginInit();
                successImage.UriSource = new Uri("pack://application:,,,/view/Icons/successImage.png");
                successImage.EndInit();

                return successImage;
            }
            else
                return null;
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }
}

可能很简单:仅在向列表中添加项目时才调用转换器,但是当我更改选项对象的值字段时虽然我正在触发OnPropertyChanged ...

显示“failImage”(因此原则上代码正在运行)但它不会更新...所以我在触发// value of option private string _value; public string value { get { return _value; } set { if (_value!= value) { _value = value; OnPropertyChanged("options"); } } } 事件时做错了什么(?)

任何帮助表示赞赏

BEGIN EDIT 08.10.2015 10.02:

“item”的定义:

OnPropertyChanged

END EDIT 08.10.2015 10.02

开始编辑09.10.2015 14.24

现在,如果我将using System; using Project.Model.Option; using System.Collections.Generic; namespace Project.Model { [Serializable] class Item: ModelBase { #region properties // label of item public string label { get; set; } // item options public List<cOption> options {get; set;}; #endregion } } 标记放在窗口中的某个位置并指向当前选定的项目

,则此功能正常工作
xml

但是我很快就将代码放入<Image Grid.Row="2" Grid.Column="1" Source="{Binding SelectedItem.AllOptionsSet, ElementName=lstSequence, Converter={StaticResource sic}, UpdateSourceTrigger=LostFocus}" Width="15" Height="15"/> (如上所述......)并像那样绑定

dataTemplate

它只是没有进入转换器......另一方面,输出窗口没有显示绑定错误..

END EDIT 09.10.2015 14.24

开始编辑09.10.2015 16.10

所以我认为我将此问题归结为以下问题:可能的原因是,虽然触发了此属性的<Image Source="{Binding AllOptionsSet, Converter={StaticResource sic}, UpdateSourceTrigger=LostFocus}" Width="15" Height="15"/> 事件,但未执行属性的getter?

我真的坚持这个。任何人

END EDIT 09.10.2015 16.10

开始编辑09.10.2015 17.19

所以我确实摆脱了转换器,只需在datatemplate中设置一个样式触发器:

NotifyPropertyChanged

因此,这也正确地设置了“failImage”(因为在向列表添加项目时,所有选项的所有“值”字段都是空的)。当我打电话给<Image Width="15" Height="15" > <Image.Style> <Style> <Style.Triggers> <DataTrigger Binding="{Binding AllOptionsSet}" Value="True"> <Setter Property="Image.Source" Value="Icons/successImage.png"/> </DataTrigger> <DataTrigger Binding="{Binding AllOptionsSet}" Value="False"> <Setter Property="Image.Source" Value="Icons/failImage.png"/> </DataTrigger> </Style.Triggers> </Style> </Image.Style> </Image> 时,它不会更新。所以基本上似乎GUI没有“监听”事件(?)

END EDIT 09.10.2015 17.19

1 个答案:

答案 0 :(得分:0)

您的问题是因为您绑定了options List<T>,但是您正在列表中包含的cOption项目上触发INPC。

您没有在INPC本身上发送INotifyCollectionChanged,(或list),因此绑定永远不会更新。