【问题标题】:How to data bind to a static property on a non-static class?如何将数据绑定到非静态类的静态属性?
【发布时间】:2011-03-03 21:30:52
【问题描述】:

在我的ViewModel 类中,我有一个静态属性AllSupport,但我不知道如何正确绑定它。 ListView 已绑定到具有 AllSupport 静态属性的 ObservableCollection AllEffects

我用过这个:

<GridViewColumn
    Width="Auto"
    Header="GPU">
    <GridViewColumn.CellTemplate>
        <DataTemplate>
            <CheckBox
                Margin="0"
                HorizontalAlignment="Center"
                IsChecked="{Binding AllSupport[HardwareType].SupportList.IsSupported, Mode=TwoWay}"/>
        </DataTemplate>
    </GridViewColumn.CellTemplate>
</GridViewColumn>

AllEffectsObservableCollectionEffectViewModel ,其中有一个名为 AllSupport 的静态属性,其类型为: Dictionary&lt;HardwareType, List&lt;EffectSupport&gt;&gt; 其中:

HardwareType 是一个枚举,并且 EffectSupport 是一个实例类,它有一个名为 IsSupported 的布尔属性。

我也试过这个,但它抱怨在 ViewModel 类上找不到 IsSupported

IsChecked="{Binding AllSupport[HardwareType].SupportList, Path=IsSupported

任何想法,如何指定此绑定?

【问题讨论】:

  • 你要绑定哪个静态属性?根据您的问题,我了解到您要绑定的属性是 IsSupported,但从您的描述来看,它似乎是 EffectSupport 类的常规属性。
  • 谢谢你是对的,我认为我忽略了一个小细节。将编辑,但 IsSupported 是 ViewModel 类中静态属性的实例属性。
  • 所以目前我的代码返回一个列表,我如何指定在 xaml 中获取其中的每个项目?

标签: c# .net wpf data-binding


【解决方案1】:

无论类是否为静态,您都可以使用x:Static 来访问静态成员。

未经测试:

IsChecked="{Binding [HardwareType], Source={x:Static prefix:EffectViewModel.AllSupport}}"

你需要一个prefix 来访问你的视图模型的命名空间。

【讨论】:

  • 感谢您的回复。所以 ViewModel 上的属性是静态的,但实际的最后一个绑定属性是一个实例。在您的示例中,您没有指定 IsSupported,您知道如何使用它吗?因为这是从 AllSupport[HardwareType].SupportList 获得的实际 EffectSupport 实例的属性。
  • 我刚刚注意到遗漏并正在查看它。也许只是将路径更改为 [HardwareType].IsSupported。仍然未经测试!
  • 我仍然遇到同样的错误,它抱怨 IsSupported 不是 [HardwareType] 返回的 List 上的属性。我做了 [HardwareType].IsSupported 虽然因为我不知道在哪里放置属性访问权限。
  • 所以基本上这与我的问题中所示的相同,只是访问路径的方式不同。我只是不知道如何使 EffectSupport 列表像 ItemsSource 那样逐项绑定,而不是将整个列表作为单个项目进行绑定。
  • 您的问题是关于绑定到静态属性 AllSupport。一旦你有了它,它就不再是一个静态问题了。这是路径问题或其他问题。为了帮助您解决剩下的问题,我需要查看更多代码。
【解决方案2】:

这是我的场景:

  • 有一个非静态类,其静态属性是 ObservableCollection
  • 该类用作记录器,并从程序中收集特定异常

问题陈述:

  • 如何将非静态类的静态成员绑定到 XAML 中的列表视图

我的解决方案:

代码隐藏(Window.cs):

public ObservableCollection<T> FooList {get {return    FooLogger.ExceptionList;}}
 //where FooLogger is a non-static class
 //and   ExceptionList is a static ObservableCollection<T>

DataContext(Window.cs):

this.DataContext=this;

XAML(Window.xaml)

<ListView ItemsSource="{Binding FooList}">
                    <ListView.View>
                        <GridView>
                            <GridViewColumn Width="Auto" Header="Name" DisplayMemberBinding="{Binding Name}" />

干杯, v0k

【讨论】:

    猜你喜欢
    • 2014-09-10
    • 1970-01-01
    • 2012-10-15
    • 2013-08-17
    • 2014-01-29
    • 1970-01-01
    • 2021-08-26
    • 2010-10-30
    相关资源
    最近更新 更多