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

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

有什么建议么?

4

3 回答 3

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>
于 2012-11-22T01:25:35.383 回答
0

您可以尝试直接绑定到可观察的集合

<ListBox Grid.Row="2" ItemsSource="{Binding Loads}">
于 2012-11-22T00:44:22.040 回答
0

首先,您是否尝试过在不修改 ListBox ItemTemplate 的情况下对其进行测试?

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

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

如果您不打算绑定到 LF,那么对 LF 实施 INotifyCollectionChanged 有什么意义?此外,我相信仅在对象上实现 INotifyCollectionChanged 并不能使其可用作项目源。它首先要实现 IEnumerable 或其他一些集合变体(IEnumerable、IList 等)。

于 2012-11-22T01:14:00.890 回答