【问题标题】:Changes in a viewmodel property is not being reflected in the UI视图模型属性的更改未反映在 UI 中
【发布时间】:2014-04-15 06:50:18
【问题描述】:

我是 WPF 的新手,我已经实现了INotifyPropertyChanged 接口。我有一个包含属性“TeamMemberList”的视图模型。控件执行 setter 部分,更改属性值,但 PropertyChanged 事件保持为空。 这是代码:

ViewModelBase:

public class ViewModelBase : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;        
    protected void NotifyPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }        
}

ViewModel:(继承了viewmodelbase) 属性是

    public List<Employee> TeamMemberList
    {
        get
        {
            return _teamMemberList;
        }
        set
        {
            _teamMemberList = value;
            NotifyPropertyChanged("TeamMemberList");
        }
    }

绑定

<ListBox Margin="10" ItemsSource="{Binding TeamMemberList, Mode=TwoWay, 
                                   UpdateSourceTrigger=PropertyChanged}" >

当新员工添加到数据库时,模型读取它并为所有员工创建列表,然后更新 TeamMeberList 属性。这是 TeamMemberList 的更新方法

    var qryEmp = from employee in ClientModel.EmployeeList
                         where employee.ReportingManager == UserProfile.EmployeeId
                         select new Employee
                         {
                             EmployeeId = employee.EmployeeId,
                             EmployeeName = employee.EmployeeName,
                             Designation = employee.Designation,
                             ProfilePic = employee.ProfilePic,
                         };
            TeamMemberList = qryEmp.ToList();

以及Employee的实现

public class Employee : ViewModelBase
{

    private string _employeeName;
    private string _employeeId;
    private string _profilePic;
    private string _designation;
    private string _reportinManager;

    public string EmployeeName
    {
        get
        {
            return _employeeName;
        }
        set
        {

            _employeeName = value;
            NotifyPropertyChanged("EmployeeName");
        }

    }


    public string EmployeeId
    {
        get
        {
            return _employeeId;
        }
        set
        {
            _employeeId = value;
            NotifyPropertyChanged("EmployeeId");
        }
    }


    public string ProfilePic
    {
        get
        {
            return _profilePic;
        }
        set
        {
            _profilePic = value;
            NotifyPropertyChanged("ProfilePic");
        }
    }


    public string Designation
    {
        get
        {
            return _designation;
        }
        set
        {
            _designation = value;
            NotifyPropertyChanged("Designation");
        }
    }
    public string ReportingManager
    {
        get
        {
            return _reportinManager;
        }
        set
        {
            _reportinManager = value;
            NotifyPropertyChanged("ReportingManager");
        }
    }
}

【问题讨论】:

  • 除非您为其分配一个委托,否则它将为空。更新绑定不是问题。显示您正在更新的代码以及您的模型(员工类)的实现。
  • @Sankarann - That will be null unless you assign a delegate to that - 这不是真的。你这是什么意思?
  • @user3217737 - 您是否将 Viewmodel 作为 DataContext 设置为您的 View?
  • @RohitVats:对于 Binding 的更新,它不需要有一个值,并且对于处理属性更改的内部使用,PropertyChanged 可以分配一个委托。
  • 但 OP 只希望它用于绑定目的。因此,无需分配委托。

标签: c# wpf


【解决方案1】:

当我们看不到更多代码时,很难说问题出在哪里(例如:您如何设置 DataContext 等...)。

但是有一种简单的方法可以通过向绑定添加以下属性来调试绑定:

<ListBox Margin="10" ItemsSource="{Binding TeamMemberList, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
         PresentationTraceSources.TraceLevel=High>

添加此属性会将整个绑定序列输出到 Visual Studio 的输出窗口。这应该指出出了什么问题。

如果您想为 所有 绑定启用此功能,您还可以使用 Visual Studio 选项:

【讨论】:

    【解决方案2】:

    使用 ObserveableCollection 代替列表

    【讨论】:

    • 虽然 List 不允许像 ObservableCollection 那样丰富的交互,但它应该仍然可以工作,所以我认为这不是解决方案
    猜你喜欢
    • 2020-05-18
    • 1970-01-01
    • 2019-10-10
    • 1970-01-01
    • 1970-01-01
    • 2012-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多