考虑一个包含自定义对象的列表框(让我们称之为“项目”),这些对象又包含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
答案 0 :(得分:0)
您的问题是因为您绑定了options
List<T>
,但是您正在列表中包含的cOption
项目上触发INPC。
您没有在INPC
本身上发送INotifyCollectionChanged
,(或list
),因此绑定永远不会更新。