我正在尝试将我的对象列表绑定到列表框。
以下是对象列表定义:
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 :(得分: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等)。