2012-11-22 127 views
0

我想將我的對象列表綁定到列表框。如何將我的對象列表綁定到列表框

這裏是對象列表定義:

class LoadFactory : INotifyCollectionChanged 
{ 
    public ObservableCollection<Load> Loads = new ObservableCollection<Load>(); 


    public LoadFactory() 
    { 
     AddLoad(new Load(15)); 
     AddLoad(new Load(12)); 
     AddLoad(new Load(25)); 

    } 

    public int LoadCount() 
    { 
     return Loads.Count(); 
    } 

    public void AddLoad(Load load) 
    { 
     Loads.Add(load); 
     if (CollectionChanged != null) 
      CollectionChanged(this, new NotifyCollectionChangedEventArgs(new NotifyCollectionChangedAction())); 
    } 

    public event NotifyCollectionChangedEventHandler CollectionChanged; 

    public ObservableCollection<Load> GetLoads() 
    { 
     return new ObservableCollection<Load>(Loads); 
    } 
} 

public class Load 
{ 
    public static int LoadCount=0; 
    public int Index = 0; 
    public Load(float LoadMagnitude) 
    { 
     magnitude = LoadMagnitude; 
     Index = LoadCount; 
     LoadCount++; 
    } 

    private float magnitude; 

    public float Magnitude 
    { 
     get 
     { 
      return magnitude; 
     } 
     set 
     { 
      magnitude = value; 
     } 
    } 

    public float ToFloat() 
    { 
     return magnitude; 
    } 

    public override string ToString() 
    { 
     return magnitude.ToString() + " ft"; 
    } 
} 

這裏是我的XAML:

<Window x:Class="Sunny3.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:Sunny3" 
    Title="MainWindow" Height="500" Width="1000"> 
<Grid> 
     <Grid Name="motherGrid"> 
     <Grid.RowDefinitions> 
      <RowDefinition /> 
      <RowDefinition /> 
      <RowDefinition /> 
     </Grid.RowDefinitions> 
     <Button Grid.Row="1" Click="Button_Click_1">Hello</Button> 
     <ListBox Grid.Row="2" ItemsSource="{Binding}"> 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <DataTemplate.Resources> 
         <Style TargetType="TextBox"> 
          <Setter Property="Margin" Value="3"></Setter> 
          <Setter Property="FontSize" Value="20"></Setter> 
          <Setter Property="Width" Value="70"></Setter> 
          <Setter Property="Foreground" Value="Blue"></Setter> 
         </Style> 
        </DataTemplate.Resources> 
        <StackPanel> 
         <Grid> 
          <TextBox Text="{Binding Path=.}"></TextBox> 
         </Grid> 
        </StackPanel> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 
    </Grid> 
</Grid> 

而且我後面的代碼:

public partial class MainWindow : Window 
{ 
    LoadFactory LF; 

    public MainWindow() 
    { 
     LF = new LoadFactory(); 
     InitializeComponent(); 
     this.DataContext = LF.Loads; 
    } 

    private void Button_Click_1(object sender, RoutedEventArgs e) 
    { 
     Load newone = new Load(154); 
     LF.AddLoad(newone); 
    } 
} 

的問題是我可以似乎沒有讓我的負載綁定到文本框。

有什麼建議嗎?

+0

您可以省略「Path =」。在TextBox中綁定。 –

+0

的省略路徑沒有幫助: -/ – David

+0

有沒有什麼辦法讓錯誤代碼綁定時失敗? – David

回答

2

您需要使負載屬性而不是字段。

public ObservableCollection<Load> Loads { get; set; } 

public LoadFactory() 
{ 
    Loads = new ObservableCollection<Load>(); 
    AddLoad(new Load(15)); 
    AddLoad(new Load(12)); 
    AddLoad(new Load(25)); 
} 

文本框綁定應該是加載類中的一個屬性。

<TextBox Text="{Binding Path=Magnitude}"></TextBox> 
+0

好,我相信這會回答爲什麼綁定不起作用。儘管如此,我仍然對實現感到困惑...... –

+0

亞瑟 - 我的實現很差,因爲這是我第一次編程GUI,我正在從書本和在線學習所有這些。這有點粗糙。您在下面給出的評論非常有價值,今天上午我將花一些時間審查您的意見並實施它們。 – David

+0

非常感謝你們兩位,因爲綁定失敗沒有任何錯誤代碼,搞清楚我出錯的地方真的很難。你的建議是非常寶貴的。 – David

0

你可以嘗試直接綁定到可觀察集合

<ListBox Grid.Row="2" ItemsSource="{Binding Loads}"> 
+0

謝謝,但不起作用。我不應該綁定到數據模板中的文本框嗎? – David

+0

是的,我會用 '<文本框的文本=「{綁定路徑=幅度}」>' – Tomas00

+0

似乎並沒有得以順利。我也試過在代碼前面取出約束力的聲明,與列表框相關聯的一個,但沒有幫助。我一直在這一段時間。這個問題看起來非常微妙,這就是爲什麼我包括整個項目。 – David

0

首先,你試圖對它進行測試,而無需修改列表框的ItemTemplate?

讓我們來看看你的DataContext。在您的MainWindow構造函數中,您有一個LoadsFactory實例,但您將「Loads」屬性設置爲Window.DataContext,而不是實例本身。然後在ListBox中將ItemsSource綁定到當前的DataContext。這樣,Listbox.ItemsSource綁定到一個ObservableCollection。精細。

由於你的LF似乎是你的主要ViewModel,將它設置爲MainWindow.DataContext並將ListBox.ItemsSource綁定到Loads屬性沒有什麼意義嗎?

如果您不打算綁定它,那麼將INotifyCollectionChanged實現爲LF會有什麼意義?另外,我相信只是在一個對象上實現INotifyCollectionChanged並不能使它作爲項目源使用。它首先實現IEnumerable或其他集合變體(IEnumerable,IList等)。

相關問題