以不同方式设置WPF ListBox中的每个项目

时间:2016-05-19 14:47:44

标签: c# wpf xaml

我对WPF& XAML。我很抱歉任何初学者/愚蠢/矛盾的问题,因为现在一切都在我的头脑中。看起来事情与使用WinForms完全不同,所以我试图用WPF方式。

在我的应用中,我想使用ListBox。

我完成了大多数简单任务所需的工作: - 将ItemsSource属性连接到我的IEnumerable实例(在我的例子中为List)。 - 在XAML中,我有ItemTemplate,到目前为止还没什么花哨的:

<Label Content="{Binding ValueA}" />
<Label Content="{Binding ValueB}" />

这项工作没问题,现在我想隐藏/显示其中一个标签,如果IEnumerable的成员满足某些条件。为此,我可以使用Label的Visibility属性。

示例:

<Label Content="{Binding ValueB}" Visibility={Binding IsValueBVisible} />

但是,如果为IEnumerable的每个成员运行代码,并提供属性IsValueBVisible的信息,即使原始成员没有它?

我想到的第一个解决方案是在原始IEnumerable对象周围使用某种包装器,但包含 IsValueBVisible 等属性。

class MyItemsSource : IEnumerable<IMyItem>, IMyItem
{
    private OtherType _source;

    public List<OtherType>: SourceList { get; set; }

    public bool IsValueBVisible
    {
        get
        {
            // now we can use _source and decide on return value
        }
    }

    public MyItem this[int index]
    {
        get
        {
            // Get original instance at index, do
            // comparisons, calculations etc.
            // return my value on which XAML can bind.
            _source = SourceList[index];

            return this;
        }
    }
}

这只是草图代码,

它可能使事情复杂化,是否有其他更清洁的方式?试着尽可能多地学习最后几天,但输了。也许几天后会更容易。

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

是的,您需要为项目创建一个包装器:

public class MyItemWrapper
{
   public MyItemWrapper(MyItem item)
   {
     Info=item;
     IsVisible = true; 
   }
   public MyItem Info {get; set;}
   public bool IsVisible {get; set;}
}

然后,您可以使用MyItemWrapper列表而不是MyItem列表:

List<MyItemWrapper> lstWrapperItems =  ... // create an instance of MyItemWrapper for each object of type MyItem

现在,您可以将此新创建的列表分配给ListBox.ItemsSource,然后在Bindings中执行以下操作:

<Label Content="{Binding Info}" Visibility={Binding IsVisible} />

现在请注意,您不需要使用“InfoA”或“IsVisibleA”,您只需在包装类中指定属性的名称。

答案 1 :(得分:0)

了解MVVM模式,有很多关于它的信息。

目标是将DataModel包装在另一个实现属性的ViewModel类中(在本例中至少为IsVisible),以将其正确绑定到{{ 1}}。