0

静的な値がほとんどない ComboBox があります。

<ComboBox Name="cmbBoxField" Grid.Column="4" Grid.Row="2" Style="{StaticResource comboBoxStyleFixedWidth}" ItemsSource="{Binding}" ></ComboBox>

MVVMModle1.cmbBoxField.Items.Add(new CustomComboBoxItem("Text Box", "0"));
MVVMModle1.cmbBoxFieldType.Items.Add(new CustomComboBoxItem("Pick List", "1"));
MVVMModle1.cmbBoxFieldType.Items.Add(new CustomComboBoxItem("Check Box", "2"));
MVVMModle1.cmbBoxFieldType.Items.Add(new CustomComboBoxItem("Radio Button", "3"));

データベーステーブルにデータを保存すると、保存されます。

((CustomComboBoxItem)(MVVMModle1.cmbBoxField.SelectedValue)).Value.ToString(); 

フォームを編集して、値をコンボボックスに再度バインドしようとすると、値が表示されません。

  MVVMModle1.cmbBoxField.SelectedValue = dtDataList.Rows[0]["ControlList"].ToString().Trim();

誰かがこれで私を助けてください。選択した値をコンボボックスにバインドする方法は?

4

2 に答える 2

1

ここのコードにはかなりの問題があります。

  • ItemsControl.ItemsSourceプロパティをデフォルトのバインディング (現在のデータ コンテキストにバインド) に設定していますが、これは、DataContextが を実装するタイプでない限り正しくIEnumerableありません。
  • DataContextたとえば、 が であるためにこれが正しい場合、が何であれ ではなく にObservableCollection<T>項目を静的に追加しているため、まだ問題があります。ComboBoxItemsSource
  • また、追加するアイテムのタイプは でありCustomComboBoxItem、これは から継承されていると仮定しComboBoxItemます。いずれにせよSelectedValue、 の値は文字列ではないため、 が何らかの文字列であるとは言えComboBoxません。
  • のコレクションを実際に持つべきではありませんが、CustomComboBoxItem代わりに、それ自体が独自の ViewModel であるカスタム クラスを使用する必要があります。

これで、問題の解決策が提案されました。

<ComboBox ItemsSource="{Binding Path=MyCollection}"
          SelectedValue="{Binding Path=MySelectedString}"
          SelectedValuePath="StringProp" />

public class CustomComboBoxItem : ComboBoxItem
{
    // Not sure what the property name is...
    public string StringProp { get; set; }

    ...
}

// I'm assuming you don't have a separate ViewModel class and you're using
// the actual window/page as your ViewModel (which you shouldn't do...)
public class MyWPFWindow : Window, INotifyPropertyChanged
{
    public MyWPFWindow()
    {
        MyCollection = new ObservableCollection<CustomComboBoxItem>();

        // Add values somewhere in code, doesn't have to be here...            
        MyCollection.Add(new CustomComboBoxItem("Text Box", "0"));
        etc ... 

        InitializeComponent();
    }

    public ObservableCollection<CustomComboBoxItem> MyCollection
    {
        get;
        private set;
    }

    private string _mySelectedString;
    public string MySelectedString
    {
        get { return _mySelectedString; }
        set
        {
            if (String.Equals(value, _mySelectedString)) return;

            _mySelectedString = value;
            RaisePropertyChanged("MySelectedString");
        }
    }

    public void GetStringFromDb()
    {
        // ...

        MySelectedString = dtDataList.Rows[0]["ControlList"].ToString().Trim();
    }
}

INotifyPropertyChanged を実装せずDependencyPropertyに MySelectedString プロパティに a を使用することもできますが、INPC を使用することをお勧めします。とにかく、それはあなたがどの方向に向かうべきかを知るのに十分な情報を与えるはずです...

TL;DR;

  • へのバインドを利用しObservableCollection<T>ます (このためのプロパティを作成します)。
  • にアイテムを追加しCustomComboBoxItemますObservableCollection<T>
  • ItemsSourceを、作成した新しいコレクション プロパティにバインドします。
  • 作成した文字列プロパティにバインドしSelectedValueます (INPC を利用します)。
  • SelectedValuePathの文字列プロパティ名のパスに を設定しますCustomComboBoxItem
于 2013-02-15T11:57:02.223 に答える
0

使えますcmbBoxField.DataBoundItem()か?選択した値からソースをターゲットにしない場合、つまり ID を取得し、ソースを再度クエリしてデータを取得します。

(CustomComboBoxItem)MVVMModle1.cmbBoxField.DataBoundItem();

データソースをバインドするときは、次のようにすると簡単です。

プライベート リスト GetItems(){

List<CustomComboBoxItem> items = new List<CustomComboBoxItem>();
    items.Add(new CustomComboBoxItem() {Prop1 = "Text Box", Prop2 = "0"});
    //...and so on
    return items;
}

次に、メインコードで:

List<CustomComboBoxItem> items = this.GetItems();

MVVMModle1.cmbBoxField.DisplayMember = Prop1;
MVVMModle1.cmbBoxField.ValueMember = Prop2;
MVVMModle1.cmbBoxField.DataSource = items;

これにより、選択した値が機能し、インデックス、値、またはテキストで選択できるようになります

var selected = dtDataList.Rows[0]["ControlList"].ToString().Trim();

MVVMModle1.cmbBoxField.SelectedValue = selected;
于 2013-02-15T11:22:33.307 に答える