Data binding 在windows phone 8中使用数据绑定将项目添加到列表

Data binding 在windows phone 8中使用数据绑定将项目添加到列表,data-binding,windows-phone-8,Data Binding,Windows Phone 8,作为学习数据绑定的一部分,我正在尝试将列表动态添加到项中。但是这些项目没有被添加。该应用程序非常简单,只需在列表中添加一个字符串 XAML代码如下所示 <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> <Grid.RowDefinitions> <RowDefinition Height="*" /> <RowDefin

作为学习数据绑定的一部分,我正在尝试将列表动态添加到项中。但是这些项目没有被添加。该应用程序非常简单,只需在列表中添加一个字符串

XAML代码如下所示

<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
        <Grid.RowDefinitions>
            <RowDefinition Height="*" />
            <RowDefinition Height="auto" />
        </Grid.RowDefinitions>

        <ListBox x:Name="TotalItems" Grid.Row="0" ItemsSource="{Binding Items_OC}">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Grid HorizontalAlignment="Stretch" Width="440">
                        <TextBlock HorizontalAlignment="Left" TextWrapping="Wrap" Text="Item : " VerticalAlignment="Top"/>
                        <TextBlock HorizontalAlignment="Left" TextWrapping="Wrap" Text="{Binding Name}" VerticalAlignment="Top" Margin="1,0,0,0" FontSize="{StaticResource PhoneFontSizeLarge}"/>
                    </Grid>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

        <Grid Grid.Row="1">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="auto" />
                <ColumnDefinition Width="auto" />
            </Grid.ColumnDefinitions>
            <TextBox x:Name="NewItem" Grid.Column="0" TextWrapping="Wrap" Width="359"/>
            <Button x:Name="Add" Grid.Column="1" Content="Add"/>

        </Grid>
    </Grid>`
    public ObservableCollection<Items> items_OC;
    public ObservableCollection<Items> Items_OC
    {
        get
        {
            return items_OC;
        }
        set
        {
            if (items_OC != value)
            {
                MessageBox.Show("Item to added to collection");
                items_OC = value;
                NotifyPropertyChanged("Items_OC");
            }
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void NotifyPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    public class Items : INotifyPropertyChanged, INotifyPropertyChanging
    {
        string name;

        public string Name
        {
            get
            {
                return name;
            }
            set
            {
                if (name != value)
                {
                    NotifyPropertyChanging("Name");
                    name = value;
                    NotifyPropertyChanged("Name");
                }
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        private void NotifyPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }

        public event PropertyChangingEventHandler PropertyChanging;

        private void NotifyPropertyChanging(string propertyName)
        {

            if (PropertyChanging != null)
            {
                PropertyChanging(this, new PropertyChangingEventArgs(propertyName));
            }
        }

    }
    private void Add_Click(object sender, RoutedEventArgs e)
    {
        Items it = new Items { Name = NewItem.Text };

        Items_OC.Add(it);
    }

`
XAML.CS代码如下所示

<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
        <Grid.RowDefinitions>
            <RowDefinition Height="*" />
            <RowDefinition Height="auto" />
        </Grid.RowDefinitions>

        <ListBox x:Name="TotalItems" Grid.Row="0" ItemsSource="{Binding Items_OC}">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Grid HorizontalAlignment="Stretch" Width="440">
                        <TextBlock HorizontalAlignment="Left" TextWrapping="Wrap" Text="Item : " VerticalAlignment="Top"/>
                        <TextBlock HorizontalAlignment="Left" TextWrapping="Wrap" Text="{Binding Name}" VerticalAlignment="Top" Margin="1,0,0,0" FontSize="{StaticResource PhoneFontSizeLarge}"/>
                    </Grid>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

        <Grid Grid.Row="1">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="auto" />
                <ColumnDefinition Width="auto" />
            </Grid.ColumnDefinitions>
            <TextBox x:Name="NewItem" Grid.Column="0" TextWrapping="Wrap" Width="359"/>
            <Button x:Name="Add" Grid.Column="1" Content="Add"/>

        </Grid>
    </Grid>`
    public ObservableCollection<Items> items_OC;
    public ObservableCollection<Items> Items_OC
    {
        get
        {
            return items_OC;
        }
        set
        {
            if (items_OC != value)
            {
                MessageBox.Show("Item to added to collection");
                items_OC = value;
                NotifyPropertyChanged("Items_OC");
            }
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void NotifyPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    public class Items : INotifyPropertyChanged, INotifyPropertyChanging
    {
        string name;

        public string Name
        {
            get
            {
                return name;
            }
            set
            {
                if (name != value)
                {
                    NotifyPropertyChanging("Name");
                    name = value;
                    NotifyPropertyChanged("Name");
                }
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        private void NotifyPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }

        public event PropertyChangingEventHandler PropertyChanging;

        private void NotifyPropertyChanging(string propertyName)
        {

            if (PropertyChanging != null)
            {
                PropertyChanging(this, new PropertyChangingEventArgs(propertyName));
            }
        }

    }
    private void Add_Click(object sender, RoutedEventArgs e)
    {
        Items it = new Items { Name = NewItem.Text };

        Items_OC.Add(it);
    }
public observeablecollection items\u OC;
公众可观察到的收集项目
{
得到
{
归还物品;
}
设置
{
如果(项目成本!=价值)
{
MessageBox.Show(“要添加到集合中的项目”);
项目=价值;
通知财产变更(“项目变更”);
}
}
}
公共事件属性更改事件处理程序属性更改;
私有void NotifyPropertyChanged(字符串propertyName)
{
if(PropertyChanged!=null)
{
PropertyChanged(这是新的PropertyChangedEventArgs(propertyName));
}
}
公共类项目:INotifyPropertyChanged、INotifyPropertyChanged
{
字符串名;
公共字符串名
{
得到
{
返回名称;
}
设置
{
如果(名称!=值)
{
NotifyPropertyChange(“名称”);
名称=值;
NotifyPropertyChanged(“名称”);
}
}
}
公共事件属性更改事件处理程序属性更改;
私有void NotifyPropertyChanged(字符串propertyName)
{
if(PropertyChanged!=null)
{
PropertyChanged(这是新的PropertyChangedEventArgs(propertyName));
}
}
公共事件属性更改EventHandler属性更改;
私有void notifyPropertyChangeg(字符串propertyName)
{
if(PropertyChange!=null)
{
PropertyChange(这是新的PropertyChangingEventArgs(propertyName));
}
}
}
私有无效添加\单击(对象发送者,路由目标)
{
Items it=newitems{Name=NewItem.Text};
项目成本增加(it);
}
感谢您的帮助。

Item.cs

public class Item
{
    public string Name { get; set; }
}
    public ObservableCollection<Item> Items { get; set; }

    public MainPage()
    {
        InitializeComponent();

        Items = new ObservableCollection<Item> { new Item { Name = "Roman" } };

        DataContext = this;
    }

    private void AddNewItem_Click(object sender, RoutedEventArgs e)
    {
        Items.Add(new Item { Name = NewItemTextBox.Text });
    }
MainPage.xaml

<Grid x:Name="ContentPanel">
    <ListBox x:Name="TotalItems"
             ItemsSource="{Binding Items}"
             VerticalAlignment="Top">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Vertical">
                    <TextBlock Text="Item :" />
                    <TextBlock Text="{Binding Name}" />
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

    <StackPanel Orientation="Vertical"
                VerticalAlignment="Center"
                Margin="0,10,0,0">
        <TextBox x:Name="NewItemTextBox" />
        <Button x:Name="AddNewItem"
                Content="Add"
                Click="AddNewItem_Click" />
    </StackPanel>
</Grid>

让事情变得简单,但不要简单

您的代码似乎缺少的是设置
DataContext
。通常,绑定解析来自
DataContext
属性的路径。以这种方式绑定
itemsource
属性时:

<ListBox x:Name="TotalItems" Grid.Row="0" ItemsSource="{Binding Items_OC}" ...>
或从XAML:

<phone:PhoneApplicationPage 
    .......
    .......
    DataContext="{Binding RelativeSource={RelativeSource Self}}"
    />


谢谢您的帮助。但我正在学习数据绑定。所以,如果你指出我在代码中犯了什么错误,那将非常有帮助。我也试过了。但结果还是一样。项目不可见。您能否确认
Add\u单击
fired?XAML中的按钮似乎没有附加事件处理程序。如果在调试模式下运行,是否有任何异常?非常感谢。很抱歉没有注意到这么一个小错误。它很好用。