我希望这个问题不要愚蠢,我试图寻找5小时的解决方案,并且大多数在这个网站上找到了有用的东西,但我无法解决我的问题。
我的物品类只有这个属性:
public string ItemName { get; set; }
一个持有物品的类:
public class ShoppingListItems
{
public static List<Item> ItemCollection { get; set; }
public ShoppingListItems()
{
ItemCollection = new List<Item>();
AddAnItem("test");
}
public static void AddAnItem(string name)
{
ItemCollection.Add(new Item()
{
ItemName = name
});
}
}
在我的XAML文件中,绑定相关代码是:
xmlns:application="clr-namespace:ShoppingListTest"
<Grid.Resources>
<application:ShoppingListItems x:Key="ShoppingListItems" />
</Grid.Resources>
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0" DataContext="{StaticResource ShoppingListItems}">
<ListBox x:Name="listBox1" Height="Auto" ItemsSource="{Binding ItemCollection, Mode=TwoWay}">
<TextBlock x:Name="textBlock1" Text="{Binding ItemName}" FontSize="50" />
然后在我的MainPage.xaml.cs中,在KeyDown的方法中我有:
ShoppingListItems.AddAnItem(textBox1.Text);
列表工作得很好,并在listBox中显示“test”,但添加到列表不起作用,我试图查看一些NotifyPropertyChanged的东西,没有任何运气。
有关更新listBox需要做什么的任何想法?如果有人有一些技巧可以使这项工作,我会很高兴!
答案 0 :(得分:2)
首先我建议不要使用静态成员,它似乎在没有使用的情况下效果更好。
ShoppingListItems的微小更改:
public class ShoppingListItems
{
public ObservableCollection<Item> ItemCollection { get; set; }
public ShoppingListItems()
{
ItemCollection = new ObservableCollection<Item>();
AddAnItem("test");
AddAnItem("test2");
AddAnItem("test3");
}
public void AddAnItem(string name)
{
ItemCollection.Add(new Item()
{
ItemName = name
});
}
}
事物是非静态的,List&lt;&gt;是ObservableCollection&lt;&gt;代替。
在xaml中:
<Grid>
<Grid.Resources>
<DataTemplate x:Key="itemLayout" DataType="{x:Type local:Item}">
<TextBlock Text="{Binding ItemName}" FontSize="50" />
</DataTemplate>
</Grid.Resources>
<ListBox x:Name="itemsListBox" Margin="2" ItemsSource="{Binding}"
ItemTemplate="{DynamicResource itemLayout}"
IsSynchronizedWithCurrentItem="True">
</ListBox>
</Grid>
在代码隐藏(与xaml文件对应的.cs文件)中:
private ShoppingListItems _shoppingList;
public MainWindow()
{
InitializeComponent();
_shoppingList = new ShoppingListItems();
itemsListBox.DataContext = _shoppingList.ItemCollection;
}
编辑:
我所做的是将数据模板放在网格资源中,同时将数据模板作为列表框资源的一部分。据我所知,唯一真正的区别是,如果模板是网格资源的一部分,它可以在多个地方使用。假设您想要两个购物清单,可能是一个用于您需要的东西,另一个用于您已购买的东西,并且您希望它们以相同的方式格式化,最好将模板放在网格中,以便两个列表都可以引用它。由于你只有一个列表,这可能无关紧要,无论哪种方式都没关系。
至于Singleton模式,请参阅: Singleton on Wikipedia
最简单的方法是让您的ShoppingListItem看起来像这样:
public class ShoppingListItems
{
private static ShoppingListItems _instance = new ShoppingListItems();
public ObservableCollection<Item> ItemCollection { get; private set; }
public static ShoppingListItems Instance { get { return _instance; } }
private ShoppingListItems()
{
ItemCollection = new ObservableCollection<Item>();
AddAnItem("test");
AddAnItem("test2");
AddAnItem("test3");
}
public void AddAnItem(string name)
{
ItemCollection.Add(new Item()
{
ItemName = name
});
}
}
答案 1 :(得分:1)
您是否尝试将ItemCollection更改为ObservableCollection而不是List?
答案 2 :(得分:0)
非常感谢Zik,您的代码更改工作正常。在我的XAML代码中,我只改为ItemSource =“{Binding}”。
我真的不明白你最后的评论。需要做一些谷歌搜索试图理解,我做的对我来说几乎是新的:)
项目列表的我的XAML代码现在是这样的:
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0" DataContext="{StaticResource ShoppingListItems}">
<ListBox x:Name="listBox1" Height="Auto" ItemsSource="{Binding}">
<ListBox.ItemTemplate>
<DataTemplate>
<Grid Margin="5" >
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<TextBlock x:Name="textBlock1" Text="{Binding ItemName}" FontSize="50" />
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Grid>
在主网格上我有这个:
<Grid.Resources>
<application:ShoppingListItems x:Key="ShoppingListItems" />
</Grid.Resources>
这似乎很有效。但如果它更好,我应该改变什么来添加你的代码,如:
<DataTemplate x:Key="itemLayout" DataType="{x:Type local:Item}">
和
ItemTemplate="{DynamicResource itemLayout}"
IsSynchronizedWithCurrentItem="True"