我有一个名为{strong> ListBoxView 的ListBox
,其中包含对象的集合。 ListBox链接到CollectionViewSource
,用于过滤来自User的键入的输入。
我想在ListBox
中显示对象的 Name 属性,当它是通用对象列表时,并且在ListBox
包含字符串列表时,我希望将它们显示为字符串。所以我用IValueConverter
来做到这一点。但是我没有使用它。
以下是我尝试过的代码:
WPF
<ListBox Grid.Row="2"
Name="BoxList"
FontFamily="Lucida Sans"
FontWeight="Light"
FontSize="13"
Margin="5"
HorizontalContentAlignment="Left"
VerticalContentAlignment="Center"
SelectionChanged="BoxList_SelectionChanged"
SelectionMode="Extended">
<ListBox.ItemTemplate>
<DataTemplate>
<ContentPresenter Content = "{Binding ElementName=BoxList,
Path=ItemsSource,
Converter={StaticResource PropertyValuNameConverter},
ConverterParameter=Name}"/>
</DataTemplate>
</ListBox.ItemTemplate>
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="Height" Value="30"/>
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
C#
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var name = string.Empty;
//Check if the value is a collection and proceed
if (value.GetType().Name == typeof(List<>).Name)
{
foreach (var item in (IList)value)
{
if (item.GetType() != typeof(string))
{
var prop = item.GetType().GetProperty("Name");
var val = prop.GetValue(value, null);
name = val.ToString();
}
else
name = item.ToString();
}
return name;
}
return "Not Converted";
}
ListBox
将显示具有相同名称的所有内容,在此示例中,我的列表包含{a,b,c,d,e,f,j,k}
,但它将als显示为k
。
经过多次尝试和大量在线搜索,我无法弄清楚哪里出了问题。我不是程序员,请帮助我了解如何解决此问题或在哪里可以寻求帮助。谢谢
答案 0 :(得分:1)
由于您要遍历所有项,因此转换器将始终返回最后一项的ToString()
表示形式。
您可以绑定到当前项目并检查该项目的类型,而不是绑定到ItemsSource
:
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var currentItem = value;
var name = "Not Converted";
if (currentItem.GetType() != typeof(string))
{
var prop = currentItem.GetType().GetProperty("Name");
var val = prop.GetValue(currentItem, null);
name = val.ToString();
}
else
name = currentItem.ToString();
return name;
}
XAML:
<ContentPresenter Content = "{Binding Path=.,
Converter={StaticResource PropertyValuNameConverter},
ConverterParameter=Name}"/>