2010-02-10 33 views
5

Tôi đã nhầm lẫn khi thiết lập chương trình SelectedItem trong các ứng dụng wpf với Net Framework 3.5 sp1 được cài đặt. Tôi đã đọc một cách cẩn thận về trăm bài viết \ chủ đề nhưng vẫn nhầm lẫn (( My XAML:Lập trình thiết lập ComboBox SelectedItem trong WPF (3.5sp1)

<ComboBox name="cbTheme"> 
    <ComboBoxItem>Sunrise theme</ComboBoxItem> 
    <ComboBoxItem>Sunset theme</ComboBoxItem> 
</ComboBox> 

Nếu tôi thêm IsSelected = "True" bất động sản trong một trong các mục - đó là bộ Dosn't mục này được chọn . tẠI sAO và tôi đã cố gắng khác nhau trong mã và vẫn không thể thiết lập mục được chọn:

cbTheme.SelectedItem=cbTheme.Items.GetItemAt(1); //dosn't work 
cbTheme.Text = "Sunrise theme"; //dosn't work 
cbTheme.Text = cbTheme.Items.GetItemAt(1).ToString();//dosn't work 
cbTheme.SelectedValue = ...//dosn't work 
cbTheme.SelectedValuePath = .. //dosn't work 
//and even this dosn't work: 
ComboBoxItem selcbi = (ComboBoxItem)cbTheme.Items.GetItemAt(1);//or selcbi = new ComboBoxItem 
cbTheme.SelectedItem = selcbi; 

Các SelectedItem không phải là tài sản readonly, vậy tại sao nó wan't việc tôi nghĩ rằng thats phải là một của Microsoft? vấn đề, không phải của tôi. Hoặc tôi đã bỏ lỡ một cái gì đó ??? Tôi đã thử p đặt với ListBox, và tất cả các công việc tốt với cùng một mã, tôi có thể thiết lập các lựa chọn, nhận được lựa chọn và như vậy .... Vì vậy, những gì tôi có thể làm gì với ComboBox? Có lẽ một số thủ thuật ???

+0

Hey @Victor bạn nên chọn câu trả lời của ihatemash – reggaeguitar

Trả lời

0

Dữ liệu ComboBox có bị ràng buộc không?

Nếu vậy bạn có lẽ tốt hơn để làm điều đó thông qua Binding chứ không phải mã ....

Xem câu hỏi này ... WPF ListView Programmatically Select Item

Có lẽ tạo ra một SelectableObject mới {text = "Abc Theme", IsCurrentlySelected = True} Liên kết tập hợp SelectableObjects với ComboBox.

Cài đặt cơ bản thuộc tính IsCurrentlySelected trong mô hình và có cập nhật giao diện người dùng từ Mô hình.

4

Nếu tôi thêm combobox và các mặt hàng theo chương trình, điều này làm việc cho tôi:

ComboBox newCombo = new ComboBox(); 

ComboBoxItem newitem = new ComboBoxItem(); 
newitem.Content = "test 1"; 
newCombo.Items.Add(newitem); 
newitem = new ComboBoxItem(); 
newitem.Content = "test 2"; 
newCombo.Items.Add(newitem); 
newitem = new ComboBoxItem(); 
newitem.Content = "test 3"; 
newCombo.Items.Add(newitem); 

newCombo.SelectedItem = ((ComboBoxItem)newCombo.Items[1]); 
newCombo.Text = ((ComboBoxItem)newCombo.Items[1]).Content.ToString(); 

newStack.Children.Add(newCombo); 

Nó cũng hoạt động nếu nó thiết lập các ItemSource tài sản theo chương trình, sau đó thiết lập các văn bản với giá trị được chọn.

4

Tạo một tài sản công trong viewmodel của bạn để xem danh sách chủ đề và một cho mục được chọn:

private IEnumerable<string> _themeList; 
    public IEnumerable<string> ThemeList 
    { 
     get { return _themeList; } 
     set 
     { 
      _themeList = value; 
      PropertyChangedEvent.Notify(this, "ThemeList"); 
     } 
    } 
    private string _selectedItem; 
    public string SelectedItem 
    { 
     get { return _selectedItem; } 
     set 
     { 
      _selectedItem = value; 
      PropertyChangedEvent.Notify(this,"SelectedItem"); 
     }    
    } 

ràng buộc combobox của bạn trong XAML để các thuộc tính như thế này:

<ComboBox 
     Name="cbTheme" 
     ItemsSource="{Binding ThemeList}"  
     SelectedItem="{Binding SelectedItem}"> 
    </ComboBox> 

bây giờ tất cả bạn làm là thêm các mục vào ThemeList để điền vào combobox. Để chọn một mục trong danh sách, thiết lập các thuộc tính được chọn để nội dung của mục bạn muốn chọn như thế này:

var tmpList = new List<string>(); 
    tmpList.Add("Sunrise theme"); 
    tmpList.Add("Sunset theme"); 

    _viewModel.ThemeList = tmpList; 
    _viewModel.SelectedItem = "Sunset theme"; 

hoặc thử thiết lập các mục đã chọn vào chuỗi giá trị của sản phẩm mà bạn muốn chọn trong của riêng bạn mã nếu bạn muốn sử dụng mã mà bạn hiện có - không chắc chắn mã đó có hoạt động hay không nhưng bạn có thể thử.

+0

đảm bảo bạn đặt datacotext chế độ xem của bạn thành bất kỳ lớp nào chứa thuộc tính ThemeList và SelectedItem - tức là ViewModel của bạn. – ihatemash

+2

Đây phải là câu trả lời được chấp nhận, đó là câu trả lời duy nhất có thể kiểm tra được – reggaeguitar

0

Trả lời từ ngữ 4

Nếu bạn đã thêm các mục trong nguồn mục. Kích hoạt PropertyChangedEvent của giá trị Selectet.

tmpList.Add("Sunrise theme"); 
    tmpList.Add("Sunset theme"); 
    PropertyChangedEvent.Notify(this,"SelectedItem"); 
7

Để chọn bất kỳ mục trong ComboBox và để thiết lập nó như là mục chọn mặc định chỉ sử dụng dòng dưới đây:

combobox.SelectedIndex = 0; //index should be the index of item which you want to be selected 
+0

làm việc cho tôi !!!! –

0

Nếu bạn biết chỉ số của các mục mà bạn muốn thiết lập, trong này là trường hợp có vẻ như bạn đang cố gắng để thiết lập chỉ số 1, bạn chỉ cần làm:

cbTheme.SelectedIndex = 1; 

tôi thấy rằng khi bạn không biết các chỉ số, đó là khi bạn có vấn đề thực sự. Tôi biết điều này vượt xa câu hỏi ban đầu, nhưng đối với nhân viên của Google về số lượng đó muốn biết cách đặt mục khi chỉ mục không được biết nhưng giá trị bạn muốn hiển thị IS đã biết, nếu bạn đang điền vào menu thả xuống với ItemSource từ một DataTable, ví dụ, bạn có thể nhận được chỉ số đó bằng cách làm này:

int matchedIndex = 0; 
if (dt != null & dt.Rows != null) 
{ 
    if (dt.Rows.Count > 0) 
    { 
     foreach (DataRow dr in dt.Rows) 
     { 
      string myRowValue = dr["SOME_COLUMN"] != null ? dr["SOME_COLUMN"].ToString() : String.Empty; 
      if (myRowValue == "Value I Want To Set") 
       break; 
      else 
       matchedIndex++; 
     } 
    } 
} 

Và sau đó bạn chỉ cần làm cbTheme.SelectedIndex = matchedIndex;.

Một lần lặp tương tự là ComboBoxItem mục thay vì DataRow hàng có thể mang lại kết quả tương tự, nếu ComboBox được lấp đầy cách OP hiển thị thay thế.

Các vấn đề liên quan