C# 无法将SelectedValue绑定到xaml from属性中WPF的组合框

C# 无法将SelectedValue绑定到xaml from属性中WPF的组合框,c#,wpf,binding,C#,Wpf,Binding,我不理解我遇到的绑定原则错误,所以我很好奇:“双向或单向源绑定无法在类型为“Demo.ViewModel.MainWindowViewModel”的只读属性“CurrentUser”上工作。”我的xaml绑定正确,除了为组合框“SelectedValue”选择了默认值之外。现在,如果我使用“SelectedValue=“1”手动执行此操作,而不是使用代码,则此属性就可以了。最终目标是我想从数据库中生成一个人员列表和他们的身份种子,这样做很好。但是我还想使用Windows登录为用户设置一个自动默认

我不理解我遇到的绑定原则错误,所以我很好奇:“双向或单向源绑定无法在类型为“Demo.ViewModel.MainWindowViewModel”的只读属性“CurrentUser”上工作。”我的xaml绑定正确,除了为组合框“SelectedValue”选择了默认值之外。现在,如果我使用“SelectedValue=“1”手动执行此操作,而不是使用代码,则此属性就可以了。最终目标是我想从数据库中生成一个人员列表和他们的身份种子,这样做很好。但是我还想使用Windows登录为用户设置一个自动默认值。如果该属性可以工作,这将是可行的,但我猜关于绑定规则,我还需要知道更多。有点像WPF绑定,它只适用于某些类型和规则。我可以欺骗它,让“Person”类拥有defaultuser,然后引用它,但它似乎应该是它自己的属性,以便得到很好的定义,我希望WPF绑定方面做得更好的人会知道我的问题

XAML:


viewmodel代码的部分C#代码隐藏:

ReadOnlyCollection<Person> _people;
string _curuser;

public string CurrentUser 
        { 
            get
            {
                if (_curuser == null)
                {
                    _curuser = "1";
                }
                return _curuser;
            } 

        }

public ReadOnlyCollection<Person> People 
        {
            get
            {
                if(_people == null)
                {
                    List<Person> persns = this.GetPeople();
                    _people = new ReadOnlyCollection<Person>(persns);
                }
                return _people;
            }
        }

        List<Person> GetPeople()
        {
            ExpensesEntities ee = new ExpensesEntities();
            return ee.tePersons.Select(x => new Person
                                         {
                                             PersonId = x.PersonID,
                                             FirstName = x.FirstName
                                         }).ToList();
        }
ReadOnlyCollection\u人;
字符串_curuser;
公共字符串当前用户
{ 
得到
{
如果(_curuser==null)
{
_curuser=“1”;
}
返回用户;
} 
}
公共只读集合人员
{
得到
{
如果(_people==null)
{
List persns=this.GetPeople();
_人员=新的只读集合(人员);
}
还人,;
}
}
列出GetPeople()
{
费用支出ee=新费用支出();
返回ee.tePersons.Select(x=>newperson
{
PersonId=x.PersonId,
FirstName=x.FirstName
}).ToList();
}

也许您忘记了在CurrentUser属性中定义set方法了? 其他事项-您的类应实现IPropertyNotify接口,但这不是错误的原因。

所选值是a,这意味着绑定属性是read以更改所选值,但如果由于用户使用组合框而更改了选择,则属性将设置为该值

因此有两种解决方案:

  • 将绑定设为单向:
    SelectedValue=“{binding Path=CurrentUser,Mode=OneWay}”
  • 在只读属性上创建setter,并正确处理用户的值更改

正确的选择取决于您的应用程序。

PersonID
string还是int?由于
CurrentUser
上没有setter,您可能希望将
BindingMode
设置为
OneWay
,这是一种可接受的方法,但是我希望以后能够更改组合框的值。我没有测试这个,但是我假设我想设置我的属性并得到它。这解决了我希望应用程序使用的方法中的问题。仅此而已,我忘记在我的属性上添加一个集合。当您提到双向和组合框的属性可以更改时,我做了一点facepalm。不,我希望它能够在我的应用程序中更改。谢谢。
ReadOnlyCollection<Person> _people;
string _curuser;

public string CurrentUser 
        { 
            get
            {
                if (_curuser == null)
                {
                    _curuser = "1";
                }
                return _curuser;
            } 

        }

public ReadOnlyCollection<Person> People 
        {
            get
            {
                if(_people == null)
                {
                    List<Person> persns = this.GetPeople();
                    _people = new ReadOnlyCollection<Person>(persns);
                }
                return _people;
            }
        }

        List<Person> GetPeople()
        {
            ExpensesEntities ee = new ExpensesEntities();
            return ee.tePersons.Select(x => new Person
                                         {
                                             PersonId = x.PersonID,
                                             FirstName = x.FirstName
                                         }).ToList();
        }