C# WPF-创建可视性列表
现在,我正在使用WPF和MVVM。我在一个UniformGrid中有30个按钮,每个按钮都有特定的DynamicSource和特定的内容(文本)。我需要管理每个按钮的可见性,但我不想为每个按钮设置变量C# WPF-创建可视性列表,c#,wpf,mvvm,visibility,C#,Wpf,Mvvm,Visibility,现在,我正在使用WPF和MVVM。我在一个UniformGrid中有30个按钮,每个按钮都有特定的DynamicSource和特定的内容(文本)。我需要管理每个按钮的可见性,但我不想为每个按钮设置变量 我在考虑创建一个可视性列表并绑定这个列表。但我不想丢失UniformGrid,只想将列表中的每个元素绑定到不同的按钮中。编辑这太疯狂了,请不要尝试 这不适合胆小的人,但一种可能是使用运行时类型系统来实现自定义属性。您可以定制自定义类型以公开所需的属性,同时仍在内部维护可见性列表。使用以下简单属性
我在考虑创建一个可视性列表并绑定这个列表。但我不想丢失UniformGrid,只想将列表中的每个元素绑定到不同的按钮中。编辑这太疯狂了,请不要尝试
这不适合胆小的人,但一种可能是使用运行时类型系统来实现自定义属性。您可以定制自定义类型以公开所需的属性,同时仍在内部维护可见性列表。使用以下简单属性:
<Button Visibility="{Binding Visibilities.V1}" />
<Button Visibility="{Binding Visibilities.V2}" />
上面引用的VisibilityType
应该扩展Type
,并根据需要返回属性列表(“V1”、“V2”、“Vn”):
最后,“VisibilityProperty”应该扩展“PropertyInfo”,并从宿主对象返回适当的值:
public class VisibilityProperty : PropertyInfo
{
private int _index;
public VisibilityProperty(int index)
{
_index = index;
}
public override string Name
{
get { return "V" + _index; }
}
public override object GetValue(object obj, BindingFlags invokeAttr, Binder binder, object[] index, CultureInfo culture)
{
var host = obj as VisibilitiesClass;
return host[_index];
}
}
请注意,上面的实现非常省略号——“Type”和“PropertyInfo”都有大量虚拟方法,其中一些方法可能需要重写。您可以通过指定索引直接绑定到列表中的项
<Button Content="Button 1" Visibility="{Binding Visibilities[0]}" />
<Button Content="Button 2" Visibility="{Binding Visibilities[1]}" />
<Button Content="Button 3" Visibility="{Binding Visibilities[2]}" />
最好的解决方案是创建ExpandObject 我创建了一个ExpandObject作为命令
var visibilitiesAsDictionary = new ExpandoObject() as IDictionary<string, Object>;
在我创建动态变量之后
private dynamic _visibilities;
public dynamic Visibilities
{
get { return _visibilities; }
set { _visibilities = value; RaisePropertyChanged("Visibilities"); }
}
那么
在Xaml中,我绑定属性
<Button Command="{Binding Item1Command}" Visibility="{Binding Visibilities.Item1}">
<Button Command="{Binding Item2Command}" Visibility="{Binding Visibilities.Item2}">
所以,当我初始化Dictionary时,按那个顺序执行并不重要,因为属性将被绑定为特定的名称。请看一看。如果您将每个按钮绑定到Visibiles列表中的一个元素,这会起作用吗。。。这不是为胆小的人准备的:)(我们应该有一个胆小的心徽章,所以…)
var handler = PropertyChanged;
if (handler != null)
{
PropertyChanged(this, new PropertyChangedEventArgs("Visibilities"));
}
var visibilitiesAsDictionary = new ExpandoObject() as IDictionary<string, Object>;
visibilitiesAsDictionary.Add("Item1", Visibility.Visible);
visibilitiesAsDictionary.Add("Item2", Visibility.Visible);
private dynamic _visibilities;
public dynamic Visibilities
{
get { return _visibilities; }
set { _visibilities = value; RaisePropertyChanged("Visibilities"); }
}
Visibilities = visibilitiesAsDictionary
<Button Command="{Binding Item1Command}" Visibility="{Binding Visibilities.Item1}">
<Button Command="{Binding Item2Command}" Visibility="{Binding Visibilities.Item2}">