Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么此ListView不随绑定属性的更改而更改?_C#_Wpf_Listview_Mvvm - Fatal编程技术网

C# 为什么此ListView不随绑定属性的更改而更改?

C# 为什么此ListView不随绑定属性的更改而更改?,c#,wpf,listview,mvvm,C#,Wpf,Listview,Mvvm,新手提出的基本问题。我一直被困在这个问题上,阅读了很多材料和一些类似的问题;希望这不是一个完全重复的问题。我尽可能地简化了代码 我正试图使ListView根据组合框中的选择显示一个过滤后的ObservableCollection)属性(作为ItemsSource?)。 具体来说,哪些“会议”与该“协调员”相关 在输出运行时,我没有看到任何数据错误,调试显示属性正确更新,但ListView保持空白。我试图避免视图中的任何代码,目前没有 谢谢 public class ViewModel : INo

新手提出的基本问题。我一直被困在这个问题上,阅读了很多材料和一些类似的问题;希望这不是一个完全重复的问题。我尽可能地简化了代码

我正试图使ListView根据组合框中的选择显示一个过滤后的ObservableCollection)属性(作为ItemsSource?)。 具体来说,哪些“会议”与该“协调员”相关

在输出运行时,我没有看到任何数据错误,调试显示属性正确更新,但ListView保持空白。我试图避免视图中的任何代码,目前没有

谢谢

public class ViewModel : INotifyPropertyChanged
{
    private ObservableCollection<Meeting> meetings;
    public ObservableCollection<Meeting> Meetings
    {
        get
        {
            return meetings;
        }
        set
        {
            meetings = value;
            OnPropertyChanged("ListProperty");
            OnPropertyChanged("Meetings");
        }
    }

    private string coordinatorSelected;
    public string CoordinatorSelected
    {
        get
        {
            return coordinatorSelected;
        }
        set
        {
            coordinatorSelected = value;
            Meetings = fakeDB.Where(v => v.CoordinatorName == CoordinatorSelected) as ObservableCollection<Meeting>;
        }
    }

    private ObservableCollection<string> comboProperty = new ObservableCollection<string> { "Joe", "Helen", "Sven" };
    public ObservableCollection<string> ComboProperty
    {
        get
        {
            return comboProperty;
        }
    }

    private ObservableCollection<Meeting> fakeDB = new ObservableCollection<Meeting>() { new Meeting("Joe", "Atlas"), new Meeting("Sven", "Contoso"), new Meeting("Helen", "Acme") };
    public ObservableCollection<Meeting> ListProperty
    {
        get
        {
            return Meetings;
        }
    }

    public class Meeting
    {
        public string CoordinatorName { get; set; }
        public string ClientName { get; set; }
        public Meeting(string coordinatorName, string clientName)
        {
            CoordinatorName = coordinatorName;
            ClientName = clientName;
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    protected void OnPropertyChanged(string propertyName)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}
公共类视图模型:INotifyPropertyChanged
{
非公开收集会议;
公开收集会议
{
得到
{
返回会议;
}
设置
{
会议=价值;
OnPropertyChanged(“ListProperty”);
房地产变更(“会议”);
}
}
选出私人字符串协调员;
公共字符串协调人当选
{
得到
{
当选的返回协调员;
}
设置
{
选定的协调人=值;
会议=fakeDB,其中(v=>v.CoordinatorName==选定的协调员)为可观察的集合;
}
}
private ObservableCollection comboProperty=新的ObservableCollection{“Joe”、“Helen”、“Sven”};
公共可观测集合属性
{
得到
{
归还财产;
}
}
private ObservableCollection fakeDB=新的ObservableCollection(){新会议(“Joe”、“Atlas”)、新会议(“Sven”、“Contoso”)、新会议(“Helen”、“Acme”)};
公共可观察收集列表属性
{
得到
{
返回会议;
}
}
公开课
{
公共字符串协调名称{get;set;}
公共字符串ClientName{get;set;}
公开会议(字符串coordinatorName、字符串clientName)
{
CoordinatorName=CoordinatorName;
ClientName=ClientName;
}
}
公共事件属性更改事件处理程序属性更改;
受保护的无效OnPropertyChanged(字符串propertyName)
{
PropertyChanged?.Invoke(这是新的PropertyChangedEventArgs(propertyName));
}
}
XAML:


更新:

这似乎表明lambda正在返回会议对象,但分配给会议的操作失败。这可能是铸造中的错误吗


再次感谢。

在触发PropertyChanged事件之前,始终必须更改属性的支持字段。否则,事件的使用者在读取属性时仍将获得旧值

更改会议属性设置器,如下所示:

public ObservableCollection<Meeting> Meetings
{
    get
    {
        return meetings;
    }
    set
    {
        meetings = value;
        OnPropertyChanged("ListProperty");
        OnPropertyChanged("Meetings");
    }
}
公众可观察收集会议
{
得到
{
返回会议;
}
设置
{
会议=价值;
OnPropertyChanged(“ListProperty”);
房地产变更(“会议”);
}
}

在触发PropertyChanged事件之前,始终必须更改属性的支持字段。否则,事件的使用者在读取属性时仍将获得旧值

更改会议属性设置器,如下所示:

public ObservableCollection<Meeting> Meetings
{
    get
    {
        return meetings;
    }
    set
    {
        meetings = value;
        OnPropertyChanged("ListProperty");
        OnPropertyChanged("Meetings");
    }
}
公众可观察收集会议
{
得到
{
返回会议;
}
设置
{
会议=价值;
OnPropertyChanged(“ListProperty”);
房地产变更(“会议”);
}
}

我相信我已经找到了两种解决同一问题的方法。错误指出@Clemens也是解决方案的一部分。如果我将ListProperty和Meetings更改为IEnumerable,那么Meetings属性问题就解决了。或者,这种方法不改变类型,我相信它使用过滤序列作为参数调用集合的构造函数

set
{
    coordinatorSelected = value;
    var filteredList = fakeDB.Where(v => v.CoordinatorName == coordinatorSelected);
    Meetings = new ObservableCollection<Meeting>(filteredList);
    OnPropertyChanged("ListProperty");
}
set
{
选定的协调人=值;
var filteredList=fakeDB.Where(v=>v.CoordinatorName==coordinatorSelected);
会议=新的可观察集合(filteredList);
OnPropertyChanged(“ListProperty”);
}

我相信我已经找到了两种解决同一问题的方法。错误指出@Clemens也是解决方案的一部分。如果我将ListProperty和Meetings更改为IEnumerable,那么Meetings属性问题就解决了。或者,这种方法不改变类型,我相信它使用过滤序列作为参数调用集合的构造函数

set
{
    coordinatorSelected = value;
    var filteredList = fakeDB.Where(v => v.CoordinatorName == coordinatorSelected);
    Meetings = new ObservableCollection<Meeting>(filteredList);
    OnPropertyChanged("ListProperty");
}
set
{
选定的协调人=值;
var filteredList=fakeDB.Where(v=>v.CoordinatorName==coordinatorSelected);
会议=新的可观察集合(filteredList);
OnPropertyChanged(“ListProperty”);
}

谢谢您抽出时间。接得好,我已经纠正了那个错误。我认为setter中的会议分配有问题-我将更新问题以修复代码,并包含调试器的屏幕截图。我想这可能是一个演员的问题,但我觉得这是对的。谢谢你抽出时间。接得好,我已经纠正了那个错误。我认为setter中的会议分配有问题-我将更新问题以修复代码,并包含调试器的屏幕截图。我认为这可能是一个强制转换问题,但在我看来是正确的。这里不需要这个选项,只使用源代码-
ItemsSource=“{Binding ListProperty,UpdateSourceTrigger=PropertyChanged}”
注意
UpdateSourceTrigger=PropertyChanged
对单向绑定没有影响。它控制双向或单向ToSource绑定更新其源属性的方式。此处不需要该选项,仅使用源工作-
ItemsSource=“{Binding ListProperty,UpdateSourceTrigger=PropertyChanged}”
注意
UpdateSourceTrigger=P