【问题标题】:Cannot bind a SelectedValue to a combobox for WPF in xaml from property无法从属性将 SelectedValue 绑定到 xaml 中 WPF 的组合框
【发布时间】:2012-12-16 12:58:39
【问题描述】:

我不理解我遇到的绑定原则错误,所以我很好奇:“TwoWay 或 OneWayToSource 绑定无法在“Demo.ViewModel.MainWindowViewModel”类型的只读属性“CurrentUser”上工作。我的 xaml 绑定正确,除了为组合框选择了默认值“SelectedValue”。现在,如果我使用 'SelectedValue = "1"' 而不是使用代码手动执行此属性,则该属性会很好。最终目标是我想从数据库中生成人员列表及其身份种子,这很好用。但我也想使用 Windows 登录然后为用户设置一个自动默认值。如果该属性有效,这将有效,但我猜我需要了解更多关于绑定规则的信息。有点像 WPF 绑定仅适用于某些类型和规则。我可以欺骗它并让“Person”类具有默认用户,然后引用它,但似乎它应该是它自己的属性来定义良好,我希望更擅长 WPF 绑定的人会知道我的问题。

XAML:

<ComboBox Height="30" Width="170" Margin="10" x:Name="combopersons" 
                    FontSize="20"
                    ItemsSource="{Binding Path=People}"
                    DisplayMemberPath="FirstName"
                    SelectedValuePath="PersonId" 
                    SelectedValue="{Binding Path=CurrentUser}" />

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();
        }

【问题讨论】:

  • PersonID 字符串还是整数?并且由于您在 CurrentUser 上没有设置器,您可能希望将您的 BindingMode 设置为 OneWay
  • 这是一种可接受的方法,但是我希望以后能够更改组合框的值。我没有对此进行测试,但我假设我想设置我的属性并获得它。这解决了我希望用于我的应用程序的方法中的问题。

标签: c# wpf binding


【解决方案1】:

选中的值为two way binding,表示绑定的属性是读取来改变选中的值,但是如果因为用户使用combobox而改变了选中的属性,则属性是设置为该值。

所以有两种解决方案:

  • 以一种方式进行绑定:SelectedValue="{Binding Path=CurrentUser, Mode=OneWay}"
  • 在只读属性上创建一个setter,并妥善处理用户的值变化。

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

【讨论】:

  • 就是这样,我忘了在我的财产上添加一个集合。当您提到两种方式并且可以更改组合框的属性时,我做了一点面手。不,我希望它能够在我的应用程序中进行更改。非常感谢。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-11
    • 2015-07-11
    • 1970-01-01
    • 2012-06-05
    • 1970-01-01
    • 2018-01-12
    • 2016-11-01
    相关资源
    最近更新 更多