【问题标题】:Silverlight - Binding child ItemsControl source to a property in a parent ItemsControl sourceSilverlight - 将子 ItemsControl 源绑定到父 ItemsControl 源中的属性
【发布时间】:2011-01-30 07:47:19
【问题描述】:

我有一个 ItemsControl,其中包含另一个 ItemsControl。 这意味着,对于父列表中的每个项目,我想显示子列表中的所有项目。

所以 Xaml 是这样的(我忽略了一些 DataTemplate)"

<ItemsControl x:Name="dayPanel" Grid.Column="1">
       <ItemsControl.ItemTemplate>
           <DataTemplate>
                 <Grid>
                     <ItemsControl x:Name="dayHours" Grid.Row="1" ItemsSource={Binding HourItems}">
                         <ItemsControl.ItemTemplate>
                              <DataTemplate>
                              </DataTemplate>
                         </ItemsControl.ItemTemplate>
                     </ItemsControl>
                 </Grid>
           </DataTemplate>
       </ItemsControl.ItemTemplate>
</ItemsControl>

现在在代码后面,我创建了一个创建天列表的类,并且每一天都包含一个小时列表。 所以我得到这样的东西:

public WeekPanel()
    {
        InitializeComponent();

        dayPanel.ItemsSource = new Dayx().CreateDays();
    }

所以.. 我在代码中定义的第一部分工作正常。 但是子 ItemsControl 没有被填充。 我想将它绑定到属性:HourItems 我该怎么做?

编辑: 好的,问题是 HourItems 属性被定义为:

Public List<Hour> HourItem {get; set;}

但当我将其更改为:

public List<Hour> HourItems
        {
            get { return hourItems; }
            set { hourItems = value; }
        }

有什么不同使它起作用?

【问题讨论】:

  • 据我所知,唯一的区别是拼写。是不是打错字了?
  • 除了拼写错误(HourItemHourItems)之外,唯一的区别是一个是自动属性,而另一个是具有支持(希望是私有)成员的常规属性。
  • 那么为什么 auto 属性不起作用?

标签: c# silverlight data-binding itemscontrol


【解决方案1】:
<ItemsControl x:Name="dayPanel" Grid.Column="1" ItemsSource={Binding}>
   <ItemsControl.ItemTemplate>
       <DataTemplate>
             <Grid>
                 <ItemsControl x:Name="dayHours" Grid.Row="1" ItemsSource={Binding HourItems}">
                     <ItemsControl.ItemTemplate>
                          <DataTemplate>
                          </DataTemplate>
                     </ItemsControl.ItemTemplate>
                 </ItemsControl>
             </Grid>
       </DataTemplate>
   </ItemsControl.ItemTemplate>

public WeekPanel()
{
    InitializeComponent();

    dayPanel.DataContext = new Dayx().CreateDays();
}

试试上面的代码。基本上我已经将您的 itemscontrol 对象的数据上下文设置为您的数据源,然后 ItemsSource 从自身获取值,并且 DataContext 应该将自身向下传递。

如果失败,请在调试时查看输出窗口,因为这通常会告诉您是否绑定失败。

【讨论】:

  • 输出窗口出现此错误:System.Windows.Data 错误:无法从“Sisy”获取“HourItems”值(类型“System.Collections.Generic.List`1[Sisy.Hour]”) .Dayx'(输入'Sisy.Dayx')。 BindingExpression: Path='HourItems' DataItem='Sisy.Dayx' (HashCode=52380055);目标元素是'System.Windows.Controls.ItemsControl'(名称='dayHours');目标属性是“ItemsSource”(类型“System.Collections.IEnumerable”)。 System.MethodAccessException:尝试通过方法“System.Windows.CLRPropertyListener.get_Value()”访问方法“Sisy.Dayx.get_HourItems()”失败。
  • 哦,天哪..我找到了答案...我要编辑我的帖子感谢您提醒我有关输出窗口的信息。
【解决方案2】:

在您的ItemsControl 中,尝试使用RelativeSource

<ItemsControl x:Name="dayHours" Grid.Row="1" ItemsSource="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=ItemsSource }">

有用的链接:

【讨论】:

  • 我试过类似的东西(唯一的区别是我给了 Path="HourItems"。不起作用 =/
猜你喜欢
  • 2020-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-15
  • 1970-01-01
  • 2012-08-23
  • 1970-01-01
相关资源
最近更新 更多