2016-03-02 109 views
3

我有类如何将ObservableCollection绑定到ListBox?

public class Clip 
{ 
     public string ID { get; set; } 
     public string Name { get; set; } 
     public int? Duration { get; set; } 
} 

而且ObservableCollection

public ObservableCollection<Clip> _clipsFound; 
public ObservableCollection<Clip> collection 
{ 
    get { return _clipsFound; } 
    set 
    { 
     _clipsFound = value; 
     OnPropertyChanged(); 
    } 
} 

OnPropertyChanged()当我做

_clipsFound = collection 

我想从收集到ListBox中有三列绑定数据被调用:ID,姓名,工作持续时间

初始化

ID = id; 
collection = new ObservableCollection<Clip>(); 
_clipsFound = collection; 
_clipsFound.Clear(); 

ICollection<Clip> ClipF = await Service.GetClips(ID); 
ICollection<Clip> Clipcol = ClipF; 
collection = new ObservableCollection<Clip>(Clipcol); 

我尝试这样做,但它不工作

<ListBox Grid.Row="2" ItemsSource="{Binding collection}" BorderBrush="Transparent" > 
    <ListBox.ItemTemplate> 
     <DataTemplate DataType="ui:Clip"> 

       <Grid> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="*"/> 
        <ColumnDefinition Width="*"/> 
       </Grid.ColumnDefinitions> 

       <TextBlock Grid.Column="0" 
                  Text="{Binding Title}" 
                  VerticalAlignment="Center" 
                  HorizontalAlignment="Left" 
                  TextTrimming="CharacterEllipsis" 
                  Foreground="#FF4F4F4F" 
                  FontSize="12" 
                  Margin="55 0 0 0"/> 
       <TextBlock Grid.Column="1" 
                  Margin="0 0 45 0" 
                  Text="{Binding Duration}" 
                  VerticalAlignment="Center" 
                  HorizontalAlignment="Right" 
                  FontSize="11" 
                  Foreground="#FF4F4F4F"/> 
      </Grid> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 

</ListBox> 

我做了什么错?

+1

请你能比“它不工作”更具体。什么不行?你什么都没得到?在调试器的输出窗口中绑定错误?还有别的吗? – ChrisF

+0

是你的“持续时间”的工作?如果是 - 你的收藏是公开的吗?你在问题中写到它的方式表明它是一个私有财产,如果我没有记错,这可能会导致问题。 –

+0

我刚刚注意到你绑定到“Title”,但是你的'Clip'类没有“Title”属性。 – ChrisF

回答

1

如果没有设置DataContext,则无法从viewmodel发送数据。 DataContext就像ViewModelView之间的通道或桥梁。

此代码设置DataContext

<Window.DataContext> 
    <vm:MainWindowViewModel />   
</Window.DataContext> 

让我们来看看工作例如:

您的视图模型:

public class MainWindowViewModel 
{ 
    publicMainWindowViewModel 
    { 
     LoadData(); 
    } 
    private void LoadData() 
    { 
     _clipsFound=new ObservableCollection<Clip>(); 
     for(int startIndex=0; startIndex<10; startIndex++) 
     { 
      collection.Add(new Clip(){ID=startIndex, Name="Bob", Duration=startIndex++}); 
     } 
    } 

    public ObservableCollection<Clip> _clipsFound; 
    public ObservableCollection<Clip> collection 
    { 
     get 
     { 
      return _clipsFound; 
     } 
     set 
     { 
      _clipsFound = value;  
     } 
    } 
} 

您的XAML:

<Window x:Class="DataGridSelectedItemsWpfApplication.MainWindow" 
    ...The code omitted for the brevity... 
    xmlns:vm="clr-namespace:DataGridSelectedItemsWpfApplication.ViewModel" 
    Title="MainWindow" WindowStartupLocation="CenterScreen" Height="550" Width="525"> 
<Window.DataContext> 
    <vm:MainWindowViewModel />   
</Window.DataContext> 
<ListBox Grid.Row="2" ItemsSource="{Binding collection}" BorderBrush="Transparent" > 
    <ListBox.ItemTemplate> 
     <DataTemplate DataType="ui:Clip">  
      <Grid> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="*"/> 
       <ColumnDefinition Width="*"/> 
       <ColumnDefinition Width="*"/> 
      </Grid.ColumnDefinitions>  
      <TextBlock Text="{Binding ID}" VerticalAlignment="Center" HorizontalAlignment="Center" FontSize="11" Margin="2" Foreground="#FF4F4F4F"/> 
      <TextBlock Grid.Column="1" Margin="2" Text="{Binding Name}" VerticalAlignment="Center" HorizontalAlignment="Center"   TextTrimming="CharacterEllipsis" Foreground="#FF4F4F4F" FontSize="12"/> 
      <TextBlock Grid.Column="2" Margin="2" Text="{Binding Duration}" VerticalAlignment="Center" HorizontalAlignment="Center" FontSize="11" Foreground="#FF4F4F4F"/> 
      </Grid> 
     </DataTemplate> 
    </ListBox.ItemTemplate>  
</ListBox> 
</Window> 

There are many ways to set DataContext

相关问题