【问题标题】:How to bind a ListView to an ObservableCollection<KeyValuePair<int,object>> inside a ViewModel in WPF?如何将 ListView 绑定到 WPF 中 ViewModel 内的 ObservableCollection<KeyValuePair<int,object>>?
【发布时间】:2011-03-22 17:13:15
【问题描述】:

类似这样的:

public class EffectViewModel
{
    public string Name ...

    ObservableCollection<KeyValuePair<int,object>> settings
    public ObservableCollection<KeyValuePair<int,object>> Settings
    {
        get {return this.settings;}
        set
        {
            this.settings = value;
            this.RaisePropertyChanged ( "Settings" );
        }
    }
}

现在我正在尝试像这样绑定它:

EffectWindowViewModel.Effects 的类型为 ObservableCollection&lt;EffectViewModel&gt;

<ListView Width="1000"
            Height="600"
            ItemsSource="{Binding EffectWindowViewModel.Effects}">
    <ListView.View>
        <GridView>
            <GridViewColumn Width="Auto"
                            DisplayMemberBinding="{Binding Key}"
                            Header="Name" />

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

但我不知道如何指定.Settings 属性。

有什么想法吗?

【问题讨论】:

  • 我看不出ObservableCollection&lt;KeyValuePair&lt;int,object&gt;&gt;ObservableCollection&lt;Tuple&lt;int,object&gt;&gt; 有什么优势。解决方案应该大致相同。
  • 它没有。在这种情况下,我没有想到使用 Tuple。但请随意。我只是不知道在那种情况下我会如何绑定。
  • 而且设置是效果的兄弟,所以这看起来行不通。
  • 为什么?所以不能数据绑定?
  • 检查您的输出窗口是否有绑定错误。顺便说一句,绑定不应该是:ItemsSource="{Binding Settings}"?导致它是您的财产的名称。并且您的 dataconext 或列表视图的源应该是 EffectViewModel 的实例

标签: c# .net wpf xaml data-binding


【解决方案1】:

您的实际绑定将不起作用,因为 EffectViewModel 没有键和值属性。我真的不知道你的列表视图应该显示什么。如果您想要一个 EffectViewModels 列表,那么 Itemssource 是正确的。如果您希望每个 EffectViewModel 进一步显示设置。那么你需要某种带有 Itemssource={Binding Settings} 的 itemsscontrol。这个 itemsscontrol 当然需要一个包含您的 Key 和 Value 的 itemsstemplate。

我这里没有 VS atm,但是您的 GridViewColumn 需要一种 CellTemplate。这个模板应该包含一个itemscontrol。因为你有 2collections! 此代码可能不正确,但应该带您朝着正确的方向前进

<ListView Width="1000"
        Height="600"
        ItemsSource="{Binding EffectWindowViewModel.Effects}">
<ListView.View>
    <GridView>
        <GridViewColumn DisplayMemberBinding="{Binding Settings}">
        <GridViewColumn.CellTemplate>
          <DataTemplatex:Key="myCell4Settings">
            <ListView ItemsSource="{Binding.}">
             <ListView.View>
             <GridView>
              <GridViewColumn Width="Auto"
                        DisplayMemberBinding="{Binding Key}"
                        Header="Name" />

                <GridViewColumn Width="Auto"
                        DisplayMemberBinding="{Binding Value}"
                        Header="Value" />
          </GridView>
         </ListView.View>
        </GridViewColumn.CellTemplate>
       </GridViewColumn>
    </ListView>
  </DataTemplate>
 </GridView>
</ListView.View>

顺便说一句,您还可以使用 2 个独立的列表。一个带有 itemssource=EffectWindowViewModel.Effects 的父 Combobox 或列表框 (x:Name=parent) 和第二个 ListView 像您一样,带有 itemssource 绑定:

ItemsSource="{Binding ElementName=parent, Path=SelectedItem.Settings}"

【讨论】:

  • 你能举个例子吗?我还想将 ItemsSource 设置为 Settings,但是我将如何指定它在 EffectWindowViewModel.Effects 内(对于每个实例)?
  • 但是您的观察是对的,我希望每个 EffectViewModel 进一步显示设置。
  • 谢谢blindmeis,顺便说一句,“”是什么意思?我不知道什么是“绑定”。表示那里?
  • 这只是意味着您绑定到当前源。这里有更多信息msdn.microsoft.com/en-us/library/ms752300.aspx
【解决方案2】:

你可以试试:

ItemsSource="{Binding ElementName=Settings, Path=EffectWindowViewModel.Effects}"

【讨论】:

  • 它在 Path 的 h 字符上显示预期的 '}'。
  • “路径”前缺少逗号。立即尝试。
  • 当我运行它时返回:System.Windows.Data 错误:4:找不到引用'ElementName = Settings'的绑定源。 BindingExpression:Path=EffectWindowViewModel.Effects;数据项=空;目标元素是'ListView'(名称='');目标属性是“ItemsSource”(类型“IEnumerable”)
  • 看我的回答。您的 GridViewColumn 绑定太“早”了,您错过了 Settings 属性是 EffectViewModel 的集合,而不是 EffectWindowViewModel.Effects 的属性
  • 你是什么意思? Settings 是每个 EffectViewModel 实例的属性,存储在 Effects 集合中。
猜你喜欢
  • 2013-12-16
  • 2013-10-16
  • 2017-09-29
  • 1970-01-01
  • 2018-05-10
  • 2012-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多