Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF-创建可视性列表_C#_Wpf_Mvvm_Visibility - Fatal编程技术网

C# WPF-创建可视性列表

C# WPF-创建可视性列表,c#,wpf,mvvm,visibility,C#,Wpf,Mvvm,Visibility,现在,我正在使用WPF和MVVM。我在一个UniformGrid中有30个按钮,每个按钮都有特定的DynamicSource和特定的内容(文本)。我需要管理每个按钮的可见性,但我不想为每个按钮设置变量 我在考虑创建一个可视性列表并绑定这个列表。但我不想丢失UniformGrid,只想将列表中的每个元素绑定到不同的按钮中。编辑这太疯狂了,请不要尝试 这不适合胆小的人,但一种可能是使用运行时类型系统来实现自定义属性。您可以定制自定义类型以公开所需的属性,同时仍在内部维护可见性列表。使用以下简单属性

现在,我正在使用WPF和MVVM。我在一个UniformGrid中有30个按钮,每个按钮都有特定的DynamicSource和特定的内容(文本)。我需要管理每个按钮的可见性,但我不想为每个按钮设置变量


我在考虑创建一个可视性列表并绑定这个列表。但我不想丢失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}">