0

Accountという新しいクラスレコードを作成するために使用しているいくつかのフィールドを含むページがあります。フィールドの1つは、コンボボックスを介して設定される通貨コードです。コンボボックスは、IDと説明を含むデータテーブルにバインドされます。コンボボックスの選択された値がAccountクラスの通貨IDを自動的に更新するように、バインディングを使用しようとしています。これまでのところ喜びはありません...

クラス定義:

class Account : IDataErrorInfo
{
    public String Name { get; set; }
    public int CurrencyID { get; set; }
    public int BankID { get; set; }
    public String AccountNumber { get; set; }
    public decimal OpeningBalance { get; set; }

 ... other definitions for validation handling ...

}

コンボボックスの定義:

<ComboBox x:Name="cboCurrency" Grid.Column="1" Grid.Row="1" Width="250" HorizontalAlignment="Left" 
     SelectedValue="{Binding Path=Account.CurrencyID, UpdateSourceTrigger=LostFocus, ValidatesOnDataErrors=True, NotifyOnValidationError=true}"
     ToolTip="{Binding ElementName=cboCurrency, Path=(Validation.Errors)[0].ErrorContent}"/>

ページコンストラクター:

public AccountAdd()
{
    InitializeComponent();

    base.DataContext = new Account();

    // Load the Currency combo with the list of currencies
    //
    cboCurrency.DisplayMemberPath = "Name";
    cboCurrency.SelectedValuePath = "_id";
    cboCurrency.ItemsSource = _DBUtils.getCurrencyList().DefaultView;


}

コードを保存:

private void btnAccountOK_Click(object sender, RoutedEventArgs e)
{
    Account newAccountRec = (Account)base.DataContext;

    int newid = _DBUtils.AddAccount(newAccountRec);
}
4

2 に答える 2

1

ComboBox の DataContext は Account インスタンスに設定されているため、その SelectedValue はCurrencyIDではなくにバインドする必要がありAccount.CurrencyIDます。

<ComboBox SelectedValue="{Binding Path=CurrencyID, ...}" ... />

また (データ テーブルがDataTableの場合)、blindmeis が提案するように、ComboBox のアイテムの各テーブル行から適切なプロパティを持つオブジェクトのコレクションを作成します。

cboCurrency.DisplayMemberPath = "Name";  
cboCurrency.SelectedValuePath = "Id";  
cboCurrency.ItemsSource =
    _DBUtils.getCurrencyList().Rows.Cast<DataRow>().Select(
        row => new { Name = row["Name"], Id = row["_id"] });
于 2012-07-31T10:42:15.220 に答える
0

バインドを容易にするために匿名型を使用できます(getcurrecylistが変更されるたびにitemssourceを設定する必要があるという欠点があります)

コードはテストされていません:

//i assume that your columns names are "Name" and "_id"
cboCurrency.DisplayMemberPath = "Name";
cboCurrency.SelectedValuePath = "Id";
cboCurrency.ItemsSource = _DBUtils.getCurrencyList().AsEnumerable().Select(x => new {Name = x["Name"], Id = x["_id"]}).ToList;

//lostfocus makes no sense or?
SelectedValue="{Binding Path=CurrencyID, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True, NotifyOnValidationError=true}"
于 2012-07-31T11:51:27.980 に答える