绑定数据-inotifypropertychanged不起作用

本文关键字:不起作用 -inotifypropertychanged 数据 绑定 | 更新日期: 2023-09-27 18:21:44

我有一个listBox1,其中的数据是从列表绑定的。然后我想当我从listBox1中选择任何项目时,listBox2将绑定来自另一个列表的数据。

    private void listBox1_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        Teams teams = (Teams)listBox1.SelectedItems[0];
        getH2hResults("//td[@class='hell']", teams.Team1, teams.Team2);                      // add elements to list
        getH2hResults("//td[@class='dunkel']", teams.Team1, teams.Team2);                 // and here also
        listBox2.ItemsSource = lists.h2hList;
    }

这是第一次工作,但两次listBox2都不显示新数据。

     public class Lists : BindableBase
{
    public Lists()
    {
        _teamsList = new List<Teams>();
        _h2hList = new List<H2H>();
    }
    private List<Teams> _teamsList;
    public List<Teams> teamsList
    {
        get
        {
            return _teamsList;
        }
        set
        {
            if (value != _teamsList)
            {
                _teamsList = value;
                RaisePropertyChanged("teamsList");
            }
        }
    }
    private List<H2H> _h2hList;
    public List<H2H> h2hList
    {
        get
        {
            return _h2hList;
        }
        set
        {
            if (value != _h2hList)
            {
                _h2hList = value;
                RaisePropertyChanged("h2hList");
            }
        }
    }
}

和XAML

       <ListBox Name="listBox1" Width="300" Height="300"
             VerticalAlignment="Top"
             HorizontalAlignment="Left"
             ItemsSource="{Binding teamsList}" SelectionChanged="listBox1_SelectionChanged">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Horizontal">
                    <TextBlock Foreground="#FF4273CD" Text="{Binding Team1, Mode=TwoWay}"></TextBlock>
                    <TextBlock Text=" vs " FontWeight="Bold"></TextBlock>
                    <TextBlock Foreground="#FF4273CD" Text="{Binding Team2, Mode=TwoWay}"></TextBlock>
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
    <ListBox Name="listBox2" Grid.Column="1" Width="300" Height="300"
             VerticalAlignment="Top"
             HorizontalAlignment="Left"
             ItemsSource="{Binding h2hList}" >
        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel Orientation="Vertical">
                    <TextBlock Text="{Binding date, Mode=TwoWay}"></TextBlock>
                    <TextBlock Text="{Binding result, Mode=TwoWay}"></TextBlock>
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>

绑定数据-inotifypropertychanged不起作用

RaisePropertyChanged("teamList");

是错误的,你的财产被命名为"teamsList",带有S,

更改为:

RaisePropertyChanged("teamsList");

它是您绑定并通知更改的公共财产,

编辑:

同时更改绑定:

ItemsSource="{Binding teamList}"

ItemsSource="{Binding teamsList}" 

编辑2:

listBox2.DataContext=xxx

非itemsource=xxx

带行(在listBox1_SelectionChanged中)

listBox2.ItemsSource = lists.h2hList;

您实际上是在从listBox2的ItemsSource属性中删除绑定。

相反,您应该只更新Lists类中的h2hList属性(这可能发生在getH2hResults中),并从代码中删除上面的行。

但请注意,仅清除并重新填写该列表是不够的。您需要设置h2hList属性以获得引发的属性更改通知:

var newList = new List<H2H>();
// fill newList before assigning to h2hList property
lists.h2hList = newList;

如果要保留列表并只更改其元素,则需要使用ObservableCollection<H2H>而不是List<H2H>作为集合类型。无论如何,这将是更好的方法,因为您不必关心何时将元素添加到新创建的集合中。