绑定列表中的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
您的问题是因为您正在绑定到options
,这是一个List<T>
,但您正在对列表中包含的cOption
项启动INPC。
您没有在list
本身上激发INPC
(或INotifyCollectionChanged
(,因此绑定永远不会更新。