3

我有一个组合框,使用 AccountType 类填充列表,并且列表被正确填充。

但是,当我将选定的项目属性绑定到作为类帐户的选定帐户时。在页面加载时,所选项目未更新。文本框等所有其他控件都在更新。

任何帮助将不胜感激。

看法

ComboBox ItemsSource="{Binding AllAccountTypes}" DisplayMemberPath="AccountTypeName" 
  SelectedValuePath="AccountTypeName" SelectedItem="{Binding SelectedAccount}" />

AccountType 类

public class AccountType:IAccountType
{
    public string AccountTypeName { get; set; }
}

账户类

public class Account: IAccount
{
    public int AccountNo { get; set; }
    public string AccountName { get; set; }
    public string AccountTypeName { get; set; }
    public int SubAccount { get; set; }
    public string Description { get; set; }
    public double Balance { get; set; }
    public string Note { get; set; }
    public bool Active { get; set; }

}

ViewModel 中的选定帐户

    public IAccount SelectedAccount { get { return selectedAccount; }
        set { selectedAccount = value;  }
    }
4

2 回答 2

0

首先,您ViewModel需要PropertyChanged提高INotifyPropertyChanged.

其次,您的绑定应指定双向绑定:

<ComboBox ItemsSource="{Binding AllAccountTypes}" DisplayMemberPath="AccountTypeName" 
  SelectedValuePath="AccountTypeName" SelectedItem="{Binding SelectedAccount, Mode=TwoWay}" />

但第三,我认为这里的主要问题是您的 Combo 框绑定到 AccountTypes 列表(即IAccountType),但您希望所选项目是IAccount. 但是 . 上没有类型IAccount的属性IAccountType

因此,您需要将 SelectedItem 绑定到 IAccountType 属性,或者将 SelectedValue 绑定到 ViewModel 上的字符串属性。例如:

<ComboBox ItemsSource="{Binding AllAccountTypes}" DisplayMemberPath="AccountTypeName"   
 SelectedItem="{Binding SelectedAccountType, Mode=TwoWay}"  />

并且在您的 ViewModel 中有一个要绑定的属性:

public IAccountType SelectedAccountType
{
    get { return selectedAccountType; }
    set
    {
        if (Equals(value, selectedAccountType)) return;
        selectedAccountType = value;
        OnPropertyChanged("SelectedAccountType");
    }
}
于 2013-10-28T15:50:45.800 回答
0

这是因为您将 SelectedItem 绑定到 IAccount 对象,但您正在从下拉列表中选择一个字符串。

我会改为绑定到一个字符串,然后在 setter 中执行设置 SelectedAccount 属性所需的操作,如下所示:

    public string SelectedAccountName
    {
        get { return _selectedAccountName; }
        set
        {
            _selectedAccountName = value;
            SelectedAccount = AllAccounts.Where(x => x.AccountName == _selectedAccountName).First();
        }
    }

使用这样的 XAML(我添加了高度和宽度值,因此下拉列表不是很大):

<ComboBox Height="20" Width="100" ItemsSource="{Binding AllAccountTypes}" DisplayMemberPath="AccountTypeName" SelectedValuePath="AccountTypeName" SelectedItem="{Binding SelectedAccountName}" />
于 2013-10-28T15:53:36.663 回答