当观察到的集合发生变化时ListView不会更新

时间:2014-04-04 18:06:19

标签: c# wpf xaml

我有以下用户界面,您可以在左侧选择一个团队,然后在右侧编辑所选团队的属性。以下是演示此问题的示例方案:

  1. 选择龙队
  2. 重命名为Smaug,按保存。
    1. "龙"在左边的选择面板中没有更新到" Smaug"。但是,如果我选择另一个团队,重新选择" Dragon",右侧的文本框仍然(正确)显示" Smaug"。我很确定这意味着数据绑定集合正在正确更新。
  3. 关闭“设置”窗口,然后重新打开它。
  4. 左侧面板现在(正确)显示" Smaug"。
  5. The UI

    团队列表存储为可观察的集合:

    public class TeamList : ObservableCollection<Team>
    {
        public TeamList() : base() { }
    }
    

    左侧的团队列表正在填充/绑定:

    SettingsWindow.xaml

    <ListView ItemsSource="{Binding}" Grid.Column="0" Grid.Row="1" DisplayMemberPath="name"
              SelectionChanged="ListTeamSelected" SelectionMode="Single">
        <!--<ListView.ItemContainerStyle>
            <Style TargetType="ListViewItem">
                <Setter Property="Foreground" Value="{Binding color}" />
            </Style>
        </ListView.ItemContainerStyle>-->
    </ListView>
    

    SettingsWindow.xaml.cs

        public Team selectedTeam { get; set; }
    
        public SettingsWindow()
        {
            teams = TeamManager.Instance().teamList;
            this.DataContext = this.teams;
            if (!Application.Current.Resources.Contains("selectedTeam"))
                Application.Current.Resources.Add("selectedTeam", selectedTeam);
            InitializeComponent();
        }
    

    正在填充和保存右侧的数据:

    SettingsWindow.xaml.cs

    private void ClickSaveData(object sender, RoutedEventArgs e)
    {
        selectedTeam.name = TeamName.Text;
        selectedTeam.color = PrimaryColorPicker.SelectedColor;
        selectedTeam.secondaryColor = SecondaryColorPicker.SelectedColor;
        saved = true;
    }
    
    private void ListTeamSelected(object sender, RoutedEventArgs e)
    {
        selectedTeam = (Team)(sender as ListView).SelectedItems[0];
        TeamInfo.Visibility = Visibility.Visible;
        TeamName.Text = selectedTeam.name;
        PrimaryColorPicker.SelectedColor = selectedTeam.color;
        SecondaryColorPicker.SelectedColor = selectedTeam.secondaryColor;
    }
    

    双重问题:

    1. 我的数据绑定是否有任何问题导致此问题? (我是WPF的新成员)

    2. 如果没有,我有办法强制UI更新左侧的列表吗? (这对我来说似乎很模糊)

    3. 提前感谢您的任何帮助!

2 个答案:

答案 0 :(得分:0)

我不知道让我的Team类实现INotifyPropertyChanged。 This link非常有帮助和直截了当。对于从未使用过数据绑定的其他人来说,有几点需要注意:

  1. 您需要获取要通知的所有属性的getter和setter才能抛出该事件。

  2. 您需要使用私有变量来保存数据本身,否则setter会触发自身,导致堆栈溢出。

  3. 事件的参数是已更改的属性的公共名称,而不是私人名称和值。

  4. 感谢@ReggaeGuitar的答案!

答案 1 :(得分:0)

您的属性需要实现INotifyPropertyChanged接口以使数据绑定正常工作。 例如(来自http://wpftutorial.net/INotifyPropertyChanged.html

private string _name;

public string Name
{
   get { return _name; }
   set 
   {
      _name = value;
      PropertyChanged("Name");
   }
}

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

我强烈推荐MVVM Light Toolkit用于任何MVVM工作(https://mvvmlight.codeplex.com/)。如果您使用MVVM Light Toolkit,那么您可以继承ViewModelBase,然后实现这样的属性

    private string _orgId;
    public string OrgId
    {
        get { return _orgId; }
        set { _orgId = value; RaisePropertyChanged("OrgId"); }
    }