如何将我的对象列表绑定到列表框

时间:2012-11-22 00:29:43

标签: c# wpf xaml binding

我正在尝试将我的对象列表绑定到列表框。

以下是对象列表定义:

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);
    }
}

问题在于我似乎无法将我的负载绑定到文本框。

有什么建议吗?

3 个答案:

答案 0 :(得分:2)

你需要让Loads成为属性,而不是字段。

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>

答案 1 :(得分:0)

您可以尝试直接绑定到observable集合

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

答案 2 :(得分:0)

首先,您是否尝试过测试而不修改ListBox ItemTemplate?

让我们来看看你的DataContexts。在MainWindow构造函数中,您有一个LoadsFactory实例,但是您将“Loads”属性设置为Window.DataContext,而不是实例本身。然后在ListBox中将ItemsSource绑定到它的当前DataContext。这样,Listbox.ItemsSource绑定到ObservableCollection。细

由于您的LF似乎是您的主要ViewModel,将它设置为MainWindow.DataContext然后将ListBox.ItemsSource绑定到Loads属性会更有意义吗?

如果你不打算绑定它,那么将INotifyCollectionChanged实现到LF有什么意义呢? 另外,我认为只是在一个对象上实现INotifyCollectionChanged并不能使它被用作项目源。它首先实现IEnumerable或其他一些集合变体(IEnumerable,IList等)。