2015-02-05 73 views
0

我有一個名爲TagGridViewUserControl,並有相應TagGridViewModel其保持ObservableCollection<TagViewModel>DataGrid使用數據綁定被顯示。 TagViewModel公開了一些屬性,我試圖在DataGrid中顯示。WPF數據網格不與來自視圖模型信息填充(數據綁定不工作)

我創建了一個按鈕,添加一個項目到ObservableCollection<TagViewModel>並顯示與收集的項目數和數據網格的項目計數一個消息。該集合正在獲取所有項目,但DataGrid一致表示其計數爲0。

這裏是XAML代碼與所述數據綁定:

<UserControl x:Class="Company.TagVisualizer.Views.TagGridView" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      mc:Ignorable="d" Width="Auto" Height="Auto" Name="TagGrid" DataContext="{Binding Source=TagGridContext}"> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition/> 
      <RowDefinition/> 
     </Grid.RowDefinitions> 
     <DataGrid Name="DataGridTag" Grid.Column="0" Grid.Row="0" ItemsSource="{Binding Path=TagsCollection}" Margin="0" CanUserReorderColumns="False" CanUserResizeColumns="True" CanUserAddRows="True" CanUserDeleteRows="True"> 
      <DataGrid.Columns> 
       <DataGridCheckBoxColumn Width="*" Header="Selected" /> 
       <DataGridTextColumn Width="3*" Binding="{Binding Path=TagName}" Header="Tag Name"/> 
       <DataGridTextColumn Width="3*" Binding="{Binding Detections.Count}" Header="Detections"/> 
       <DataGridTextColumn Width="3*" Binding="{Binding EarliestDetection}" Header="Earliest Detection"/> 
       <DataGridTextColumn Width="3*" Binding="{Binding LatestDetection}" Header="Latest Detection"/> 
      </DataGrid.Columns> 
     </DataGrid> 
     <Button Grid.Column="0" Grid.Row="1" Content="Add" Click="Add_OnClick"/> 
    </Grid> 

</UserControl> 

下面是TagGridView代碼隱藏文件:

public partial class TagGridView : UserControl 
    { 
     private TagGridViewModel _tagGridViewModel = new TagGridViewModel(); 

     public TagGridView() 
     { 
      InitializeComponent(); 

     } 

     public TagGridViewModel TagGridContext { get { return _tagGridViewModel; } set { _tagGridViewModel = value; } } 

     private void Add_OnClick(object sender, RoutedEventArgs e) 
     { 
      TagGridContext.TagsCollection.Add(new TagViewModel("Boogie", 134.5, 145.8)); 

      MessageBox.Show(string.Format("Items in collection: {0}\nItems in Grid: {1}", TagGridContext.TagsCollection.Count, DataGridTag.Items.Count)); 
     } 
    } 

這裏是TagGridViewModel類:

public class TagGridViewModel 
    { 
     private ObservableCollection<TagViewModel> _tagsCollection = new ObservableCollection<TagViewModel>(); 

     public ObservableCollection<TagViewModel> TagsCollection 
     { 
      get { return _tagsCollection; } 
      set 
      { 
       _tagsCollection = value; 
      } 
     } 
    } 

我不確定發生了什麼事。我曾嘗試在UserControl標記和DataGrid標記中設置DataContext。無論我做什麼,DataGrid都不會向其自身添加任何項目。

回答

1

這是用戶控件的DataContext問題。請參考下面的代碼進行數據綁定。

<UserControl x:Class="Tags_Learning.TagGridView" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     mc:Ignorable="d" 
     d:DesignHeight="300" d:DesignWidth="300" **DataContext="{Binding Path=TagGridContext, RelativeSource={RelativeSource Self}}"**> 
<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition/> 
     <RowDefinition/> 
    </Grid.RowDefinitions> 
    <DataGrid Name="DataGridTag" Grid.Column="0" Grid.Row="0" ItemsSource="{Binding Path=TagsCollection}" Margin="0" 
       CanUserReorderColumns="False" CanUserResizeColumns="True" CanUserAddRows="True" CanUserDeleteRows="True"> 
     <DataGrid.Columns> 
      <DataGridCheckBoxColumn Width="*" Header="Selected" /> 
      <DataGridTextColumn Width="3*" Binding="{Binding Path=TagName}" Header="Tag Name"/>     
      <DataGridTextColumn Width="3*" Binding="{Binding EarliestDetection}" Header="Earliest Detection"/> 
      <DataGridTextColumn Width="3*" Binding="{Binding LatestDetection}" Header="Latest Detection"/> 
     </DataGrid.Columns> 
    </DataGrid> 
    <Button Grid.Column="0" Grid.Row="1" Content="Add" Click="Add_OnClick"/> 
</Grid> 

+0

謝謝。我會在RelativeSource上做更多的閱讀。 – CanadaIT 2015-02-05 21:47:20