簡體   English   中英

C#-WPF ComboBox未在代碼隱藏中設置默認值

[英]C# - WPF ComboBox not setting default value in Code-behind

我的WPF應用程序的以下代碼將默認值顯示為空白,而不是CA 我已經在調試模式下測試cmbStates.SelectedValue正顯示出NULL后,我移動到下一行,而使用F11VS2017 我試過將代碼移到Windows加載的事件,但仍然是完全相同的行為。

注意事項

  1. 根據這篇文章,它應該起作用,但事實並非如此。 也許我的情況有些不同
  2. 該代碼成功顯示了comboBox值,但除非我手動為comboBox選擇一個特定的值,否則comboBox的頂部為空白。

問題 :我可能在這里缺少什么,我們如何使它工作?

XAML

<Window x:Class="WpfTestApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
....
....
>
 <Grid>
....
....
<ComboBox x:Name="cmbStates" IsEditable="True" SelectedValuePath="Content" SelectionChanged="cmbStates_SelectionChanged" />
....
....

  </Grid>
</Window>

MainWindow的背后代碼

....
public MainWindow()
{
    InitializeComponent();

    cmbStates.ItemsSource = new List<string>() {"OH", "VA", "CA", "TN", "CA", "DE"};
    cmbStates.SelectedValue =  "CA";
}
....

更新

請注意,該問題更特定於在Code Behind而不是在XAML設置默認值,因為該列表的長度比本帖子中顯示的長得多(為簡便起見),並且默認值並不總是“ CA”-它會有所不同根據業務需求。 您可以將“ CA”視為某些字符串變量值,但是想法是相同的。

為什么不顯示所選項目的問題是此xml屬性:

SelectedValuePath="Content"

SelectedValue設置為“ CA”時,不會顯示它,因為您建議視圖檢查SelectedItem的屬性Content ,但是對於您使用的string當然不存在。

為了使其適用於上述示例,您只需在組合框中刪除該屬性。

另一方面,如果綁定項是類,則需要顯示一個字段,並需要另一個字段作為值/標識符,那么與DisplayMemberPath屬性結合使用SelectedValuePath就可以了。

假設您的商品看起來像這樣:

public class SomeModel
{
    public string Abbreviation { get; set; }
    public string Content { get; set; }

    public SomeModel(string abbreviation, string content)
    {
        Abbreviation = abbreviation;
        Content = content;
    }
}

在這種情況下, ComboBox將如下所示:

<ComboBox x:Name="cmbStates" IsEditable="True" SelectedValuePath="Abbreviation" DisplayMemberPath="Content" SelectionChanged="cmbStates_SelectionChanged" />

這樣, 縮寫屬性是ComboBoxItem的實際值,而Content用作ComboBox的顯示。 現在,您的MainWindow構造函數將如下所示:

public MainWindow()
{
    InitializeComponent();

    cmbStates.ItemsSource = new List<SomeModel>
    {
        new SomeModel("OH","Ohio"), new SomeModel("VA","Virginia"), new SomeModel("CA","California "),
        new SomeModel("TN","Tennessee"), new SomeModel("DE","Delaware")
    };
    cmbStates.SelectedValue = "CA";
}

除了這種情況,我建議您研究WPF數據綁定WPF MVVM模式

由於將ComboBoxItemsSource設置為List<string> ,因此應將SelectedItem屬性設置為此列表中包括的string ,並從XAML中刪除SelectedValuePath="Content" ,因為string沒有Content屬性:

cmbStates.ItemsSource = new List<string>() {"OH", "VA", "CA", "TN", "CA", "DE"};
cmbStates.SelectedItem =  "CA";

XAML:

<ComboBox x:Name="cmbStates" IsEditable="True" SelectionChanged="cmbStates_SelectionChanged" />

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM