【问题标题】:Bind Listview to ObservableCollection将 Listview 绑定到 ObservableCollection
【发布时间】:2018-05-21 04:10:34
【问题描述】:

我正在尝试将列表视图绑定到 ObservableCollection。

我查看了堆栈上的几个主题,但找不到我做错了什么:

我的 XAML 看起来像这样(对于 GridViewColumn,我尝试了使用 Path= 和没有,因为我看到了它们):

<ListView x:Name="ListView1"  ItemsSource="{Binding listeAff}"  Grid.Row="3" Grid.Column="0" Grid.ColumnSpan="4" MouseDoubleClick="ListView_MouseDoubleClick" GridViewColumnHeader.Click="GridViewColumnHeaderClickedHandler" >
            <ListView.ContextMenu>
                <ContextMenu x:Name="Context1">
                    <MenuItem Header="{x:Static p:Resources.ContextSupprimer}" Click="Supprimer_Element"/>
                    <MenuItem x:Name="MenuBarNesting" Header="{x:Static p:Resources.ContextMiseEnBarre}" Click="Open_MiseEnBarre"/>
                    <MenuItem x:Name="MenuExportDSTV1" Header="{x:Static  p:Resources.ContextExport}" Click="Export_DSTV"/>
                    <MenuItem x:Name="AjouterAffaire" Header="{x:Static  p:Resources.AjouterAffaire}" Click="AjoutAffaire"/>
                    <MenuItem x:Name="ModifyAffaire" Header="{x:Static  p:Resources.Edit}" Click="ModifierAffaire"/>
                </ContextMenu>
            </ListView.ContextMenu>
            <ListView.View>

                <GridView AllowsColumnReorder="true" x:Name="GridView1">
                    <GridViewColumn DisplayMemberBinding="{Binding Path=ID}" Header="ID" />
                    <GridViewColumn DisplayMemberBinding= "{Binding Nom}" Header="{x:Static p:Resources.Nom}"/>
                    <GridViewColumn DisplayMemberBinding="{Binding Code}" Header="{x:Static p:Resources.Code}"/>
                    <GridViewColumn DisplayMemberBinding="{Binding Comm}" Header="{x:Static p:Resources.Commentaire}"/>

                </GridView>
            </ListView.View>
        </ListView>

那么后面的代码是这样的:

public ObservableCollection<Affaire> listeAff { get; set; }
        public MainWindow()
        {
            Thread.CurrentThread.CurrentUICulture = new CultureInfo(Properties.Settings.Default.Langue);
            InitializeComponent();
            Initialisation();
            listeAff = new ObservableCollection<Affaire>();
            DBConnect DataBase = new DBConnect();
            string requete = "SELECT * FROM affaire ORDER BY ID";
            List<Affaire> liste = DataBase.Select_affaire(requete);
            foreach(Affaire aff in liste)
            {
                listeAff.Add(aff);
            }
            DataContext = this;

在那部分我的 ListView 显示正确,但是当我想删除(例如)列表中的某些对象时,listview 没有更新:

foreach (Affaire aff in ListView1.SelectedItems)
                    {
                        listeAff.Remove(aff);
                    }

我错过了什么?

【问题讨论】:

  • 您是否在此处获取任何行 List liste = DataBase.Select_affaire(requete); , 你能检查一下调试吗
  • 所以是的,我重新返回了一些行,并且列表也更新了,但是正如 Monish Koyott 所提到的,我没有任何 InotifyPropertyChanged(我第一次尝试 ObservableCollections),我正在尝试实现它, 但这不是一件容易的事:)
  • 你能按照我的建议尝试数据绑定吗,DataContext = this;表示您正在将 datacontext 分配给您的列表视图所在的窗口
  • 更新了我的答案,如何实现NotifyPropertyChanged..看看
  • 这对你有用吗??

标签: c# listview binding observablecollection


【解决方案1】:

您必须执行以下操作才能获取更新的值

public class ChangeViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged=delegate {};

    private void NotifyPropertyChanged([CallerMemberName] String 
                                                  propertyName = "")
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new 
                 PropertyChangedEventArgs(propertyName));
        }
    }

    ObservableCollection<Affaire> affaireListObservable;
    public ObservableCollection<Affaire> AffaireListObservable {
      get { return affaireListObservable; }
      set {
        affaireListObservable= value;
        if(PropertyChanged!=null) {
          NotifyPropertyChanged();
        }
      }
    }    
    public ChangeViewModel()
    {
        AffaireListObservable  = new ObservableCollection<Affaire>();
    }
    public void RemoveFromList()
    {
         foreach (Affaire aff in ListView1.SelectedItems)
         {
              AffaireListObservable.Remove(aff);
         }
    }
}

仔细检查您的绑定,当您将 DataContext 分配给 widnow 时,您可以在树中向上直到窗口并使用它,并将您的 listview 绑定到窗口的 DataContext

<ListView ItemsSource="{Binding Path=DataContext.listeAff ,
        RelativeSource={RelativeSource 
   Mode=FindAncestor,AncestorType=Window}}" 
  />

【讨论】:

  • 试过那个,但结果是一样的。这个 FallbackValue=BindingFailed 应该做什么?
  • @Siegfried.V - 如果您获取的数据比您的绑定没问题,那么无需尝试我的投标部分,但我建议您在代码中使用 InotifyPropertyCahnged 接口并检查项目是否已删除与否
  • 谢谢(即使我迟到了),最后几天我读了一些课程,首先能够绑定简单的列表......而你的这部分正是我需要在彼此:)
  • 我仍然遇到问题,我编辑原始消息以使其更清晰,因为原始消息相当“错误”
  • 我决定发布一个新问题,让事情更“干净”...我刚刚在这里发布问题:stackoverflow.com/questions/47748369/…
【解决方案2】:

一旦您从集合中删除或移除某些内容,用户界面必须收到通知,以便相应地进行自我更新。您需要做的是在您的班级中使用 INotifyPropertyChanged 事件。你可以了解所有你想要的here

学习愉快,编码愉快!!

【讨论】:

  • 仅供参考,一切都解决了,只需要添加这个 INotifyPropertyChanged 就可以了,谢谢
  • 太棒了!!很高兴能对你有所帮助。
猜你喜欢
  • 2012-05-26
  • 2017-09-29
  • 1970-01-01
  • 1970-01-01
  • 2018-05-10
  • 1970-01-01
  • 2015-09-02
相关资源
最近更新 更多