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