2010-04-22 126 views
0

我想将WPF数据网格中的文本块文本绑定到依赖项属性。不知何故,没有显示,但当我在网格外使用相同的文本块绑定时,一切正常。下面是我的代码,依赖属性WPF Grid

 </Grid.RowDefinitions> 

     <StackPanel Grid.Row="0"> 
      <toolkit:DataGrid Name="definitionGrid" Margin="0,10,0,0" AutoGenerateColumns="False" 
               CanUserAddRows="False" CanUserDeleteRows="False" IsReadOnly="False" 
               RowHeight="25" FontWeight="Normal" ItemsSource="{Binding Subscription}" 
               ColumnHeaderStyle="{DynamicResource ColumnHeaderStyle}" 
               SelectionMode="Single" ScrollViewer.HorizontalScrollBarVisibility="Disabled" Width="450" 
           ScrollViewer.VerticalScrollBarVisibility="Auto" Height="200">   
        <toolkit:DataGridCheckBoxColumn Header="Email" Width="60" Binding="{Binding ReceivesEmail}" CellStyle="{StaticResource cellCenterAlign}"/> 

        <toolkit:DataGridTemplateColumn Header="Others" Width="220" CellStyle="{StaticResource cellCenterAlign}" IsReadOnly="True"> 
         <toolkit:DataGridTemplateColumn.CellTemplate> 
          <DataTemplate> 
           <TextBlock Text="{Binding Path=OtherSubs}"/> 
          </DataTemplate> 
         </toolkit:DataGridTemplateColumn.CellTemplate> 
        </toolkit:DataGridTemplateColumn> 
       </toolkit:DataGrid.Columns> 
      </toolkit:DataGrid> 
      <TextBlock Text="{Binding Path=OtherSubs}"/> 
     </StackPanel> 

代码隐藏

public string OtherSubs 
{ 
    get { return (string)GetValue(OtherSubsProperty); } 
    set { SetValue(OtherSubsProperty, value); } 
} 
public static readonly DependencyProperty OtherSubsProperty = DependencyProperty.Register("OtherSubs", typeof(string), 
    typeof(ProgramSubscriptions), new UIPropertyMetadata(string.Empty)); 

     //other.... 
     for (int i = 0; i < OtherPrgList.Count; i++) 
     { 
      foreach (int y in myList) 
      { 
       ProgramSubscriptionViewModel otheritem = OtherPrgList[i]; 
       if (y == otheritem.Program.ID) 
        OtherSubs += otheritem.Subscriber.Username + ", "; 
      } 
     } 

请不要让我知道如果有另一种方式,我可以完成这项工作,而不是使用一个DependencyProperty,althouht测试我做把数据网格下面的文本块,它工作得很好.. 帮助!

+0

我假设OtherSubs是一个集合中的类的一部分,并且DataGrid的ItemsSource被设置为这个集合? – 2010-04-22 15:57:58

回答

2

认购属性必须是ProgramSubscriptions对象的集合。它必须至少支持IEnumerable接口。通常情况下,你会有类似列表<ProgramSubscriptions>。此外,OtherSubs显然是ProgramSubscriptions,这是好的。

您能否请您说明您如何使用“在网格之外的相同文本块绑定”?

+0

在网格外部,我使用下面的代码, 它工作。你能告诉我上面的代码将工作,我很新的WPF,我不知道如何做到这一点.. – developer 2010-04-22 17:34:25

+0

我的订阅属性是ProgramSubscriptions对象obsrvablecollection ..请帮助.. – developer 2010-04-22 18:29:09

+0

那么,这有点令人困惑。如果上面的TextBlock与DataGrid并排工作,那么看起来好像TextBlock的和DataGrid的父级DataContext绑定到某个ProgramSubscriptions实例,因此ItemsSource =“{Binding Subscription}”无法工作。哪些类实现了Subscription属性? 你可以看看Debug窗口吗?如果有一些绑定错误,他们应该在那里记录。如果你不能自己破译它们,请将它们张贴在这里。 – wpfwannabe 2010-04-22 18:50:38

0

您正在将DataGrid绑定到订阅。无论DataGrid的DataContext是什么,这都必须是一个属性。正如wpfwannabe所说,它应该支持IEnumerable。理想情况下,您将拥有ObservableCollection<>或派生的,因此DataGrid会自动更新。

从那里DataGrid将获得它应该显示的项目。要显示实际的数据,你有你的DataGridTemplateColumn定义。由于您绑定到OtherSubs,这意味着您的Subscription IEnumerable枚举的对象应具有该属性。顺便说一句,它不需要是一个依赖属性,这个工作。

+0

订阅属性是一个Observable对象集合.. – developer 2010-04-22 18:21:32

+0

你的问题可能是一个WPF“bug”。参见http://blogs.msdn.com/jaimer/archive/2008/11/22/forwarding-the-datagrid-s-datacontext-对其- columns.aspx – 2010-04-23 09:49:46