0

ソースとして Country オブジェクトのコレクションを持つコンボ ボックスがあります (ビュー モデルの Country プロパティにバインドされます)。

Country コンボは、ユーザー フォームの一部に表示されます。ユーザー フォームは、ユーザー オブジェクトから生成されます。ユーザー オブジェクトは、CountryID のみを保持します (つまり、Country への外部キー)。現在、名前のテキスト ボックスをユーザー オブジェクトの名前プロパティなどにバインドして、ユーザー フォームにデータを入力しています。

コンボの私のバインディングは次のとおりです。

ItemsSource="{Binding Countries}" DisplayMemberPath="CountryDescription" 

したがって、現在読み込まれているユーザーについては、国 ID を取得し、それを国コンボに何らかの方法でバインドする必要がありますか? 国のコンボにはintのリストがなく、Countryオブジェクトのリストがあるため、これを行うにはどうすればよいですか。私はコンバーターの使用について考えましたが、コンボのソースに対応する CountryID を持つ国オブジェクトがあるため、これはやり過ぎのようです。

ユーザーの CountryID プロパティを取得して Country コンボにバインドし、Country コンボをフレンドリなユーザー名にする方法はありますか? ユーザーが別の国を選択できるようにする必要があるため、双方向バインディングが必要です。これにより、ユーザー オブジェクトの対応する countryID プロパティが更新されます。

どんな助けでも大歓迎です!乾杯...

編集

これが私が持っているものの縮小版です(わかりやすくするために、すべてのnotifypropertychangedコードを省略しました)

class User
{
    public int UserID 
    {
        get;set;
    }

    public string Username
    {
        get;set;
    }

    public int CountryID
    {
        get;set;
    }
}

class Country
{
    public int CountryID
    {
        get;set;
    }

    public string CountryDescription
    {
        get;set;
    }
}

私のビュー モデルには、単に Country オブジェクトのリストである Countries プロパティがあります (上記のバインド)。ビューには、ユーザー名のテキスト ボックスと、国の説明を表示するコンボ ボックスがあります。ビュー モデルには、ビューをバインドするための "User" プロパティがあります。ユーザー名のバインディングは次のとおりです。

<TextBox x:Name="NameBox" Text=" {Binding User.Username, Mode=TwoWay}"   
DataContext="{Binding}" />

私が抱えている問題は、国のコンボの選択されたアイテムのバインディングです。次のように、コンボに 2 つの国オブジェクトがあるとします。

CountryID = 1、CountryDescription = "フランス" CountryID = 2、CountryDescription = "スペイン"

ユーザーは次のように設定されます。

ユーザー ID = 1、ユーザー名 = "ボブ"、国 ID = 1。

コンボは「フランス」を表示する必要があります。ただし、ユーザーがフランスをスペインに変更した場合、ユーザーの CountryID を 2 に変更する必要があります。

4

2 に答える 2

0

基本的に、コンボ ボックスに存在するValueMemberPathが必要でした。

代わりに、コンボックス内の各アイテムは国アイテムにバインドされるため、実際に必要なのは、Countryオブジェクトを ID 番号/int に変換する値コンバーターです (双方向が必要な場合は元に戻ります。それ以外の場合は、以下のコードが機能します)。 .

例:

public class CountryConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        Country country = (Country)value;
        return country.CountryId;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        /// Not sure yet the best way to get the correct Country object instance, unless you can attach it to the convertor, pass it as a ConvertorParameter or just make it global. :)
    }
}

双方向の問題は、数値から Country オブジェクトの正しいインスタンスに変換するために、コントロールによって使用される Country オブジェクトの実際のリストにアクセスする必要があることです。

とにかく、ComboBox の SelectedItem を User.CountryID プロパティにバインドするだけです (もちろん、コンバーターも指定します)。

<TextBox x:Name="NameBox" SelectedItem={Binding User.CountryID, Convertor={StaticResource CountryConverter}} Text="{Binding User.Username, Mode=TwoWay}" DataContext="{Binding}" />

そして、次のようなページ リソースでコンバーターを宣言します。

<UserControl.Resources>
  <local:CountryConverter x:Key="CountryConverter" />
</UserControl.Resources>
于 2012-07-03T13:08:13.533 に答える
0
private Country _SelectedCountry;
public Country SelectedCountry
{
    get
    {
        return _SelectedCountry;
    }

    set
    {
        if(value != null && value != _SelectedCountry)
        { 
            if(User.CountryID != value.CountryID) 
                User.CountryID = value.CountryID;
            _SelectedCountry = value;
        }
    }
}

すべての必要な場所に RaisePropertyChanged を配置することを忘れないでください。これを理解するのに問題がある場合は、私に知らせてください。

于 2012-07-03T13:18:30.527 に答える