绑定列表中的imageSource属性更改,而列表又位于列表中托管的对象内部

本文关键字:列表 对象 内部 于列表 属性 imageSource 绑定 | 更新日期: 2023-09-27 18:16:41

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

项目的布局在xaml中的dataTemplate中定义。基本上有一条线:

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

最后在选项定义中

// value of option
    private string _value;
    public string value
    {
        get
        {
            return _value;
        }
        set
        {
            if (_value!= value)
            {
                _value = value;
                OnPropertyChanged("options");
            }
        }
    }

可能很简单:转换器只在向列表中添加项时调用,但在我更改选项对象的值字段时不会调用,尽管我正在启动OnPropertyChanged。。。

显示"故障图像"(因此原则上代码正常工作(,但不会更新。。。所以我在触发OnPropertyChanged事件(?(时出错了

感谢的任何帮助

开始编辑08.10.2015 10.02:

"项目"的定义:

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

结束编辑08.10.2015 10.02

开始编辑09.10.2015 14.24

现在,如果我把xml标签放在窗口的某个地方,并指向当前选择的项目,这就可以了

<Image Grid.Row="2" Grid.Column="1"  Source="{Binding SelectedItem.AllOptionsSet, ElementName=lstSequence, Converter={StaticResource sic}, UpdateSourceTrigger=LostFocus}" Width="15" Height="15"/> 

但一旦我把代码放入dataTemplate(如上所述…(并像一样绑定

<Image Source="{Binding AllOptionsSet, Converter={StaticResource sic}, UpdateSourceTrigger=LostFocus}" Width="15" Height="15"/>

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

结束编辑09.10.2015 14.24

开始编辑09.10.2015 16.10

因此,我想我将其归结为以下问题:尽管触发了该属性的NotifyPropertyChanged事件,但该属性的getter没有被执行,这可能是什么原因?

我真的很纠结。任何人

结束编辑09.10.2015 16.10

开始编辑09.10.2015 17.19

因此,我确实去掉了转换器,只需在数据模板中设置一个样式触发器:

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

因此,这也正确地设置了"failImage"(因为当将项目添加到列表中时,所有选项的所有"值"字段都是空的(。当我呼叫INPC(AllOptionsSet)时,它不会更新。因此,基本上GUI似乎不会"监听"事件(?(

结束版2015年10月9日17.19

绑定列表中的imageSource属性更改,而列表又位于列表中托管的对象内部

您的问题是因为您正在绑定到options,这是一个List<T>,但您正在对列表中包含的cOption项启动INPC。

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