我对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;
}
}
}
这只是草图代码,
它可能使事情复杂化,是否有其他更清洁的方式?试着尽可能多地学习最后几天,但输了。也许几天后会更容易。
感谢您的帮助。
答案 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}}。