簡體   English   中英

手動設置組合框項目時,如何使用mvvm中的綁定在wpf中設置組合框默認值

[英]how to set combobox default value in wpf using binding in mvvm when manually setting combobox items

我在WPF中使用mvvm。 我正在設置一個表單來更新用戶數據。 我有一個組合框可以選擇用戶性別。 我已經在源代碼中手動添加了組合框項目。 加載數據以形成所有字段時,其他字段將正確顯示。 但組合框未顯示任何內容。 我使用了twoWay綁定,並且我從表單中選擇的值都進入了viewModel。我一直在搜索數小時,發現了許多類似的問題,但對我沒有任何幫助。 我在下面插入我的代碼段。 請給我一個解決方案。

<ComboBox 
    Grid.Column="2" 
    SelectedItem="{Binding SelectedEmployees.gender, Mode=TwoWay}" 
    SelectedValue="{Binding SelectedEmployees.gender, Mode=TwoWay}"
    >
    <ComboBoxItem Content="Male"/>
    <ComboBoxItem Content="Female"/>
</ComboBox> 

我的viewModel代碼如下

class EmployeesModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    private iServiceClient serviceClient = new iServiceClient();
    public EmployeesModel()
    {
        this.RefreshEmployees();
    }

    private void RefreshEmployees()
    {
        this.serviceClient.GetAllEmployeesCompleted += (s, e) =>
          {
              this.employees = e.Result;
          };

        this.serviceClient.GetAllEmployeesAsync();
    }

    private IEnumerable<Employee> employees;
    public IEnumerable<Employee> Employees
    {
        get
        {
            return this.employees;
        }
        set
        {
            this.employees = value;
            this.OnPropertyChanged("Employees");
        }
    }

    private Employee selectedEmployees;
    public Employee SelectedEmployees
    {
        get
        {
            return this.selectedEmployees;
        }
        set
        {
            this.selectedEmployees = value;
            this.OnPropertyChanged("SelectedEmployees");
        }
    }

    public void OnPropertyChanged(string PropertyName)
    {
        if (this.PropertyChanged != null)
        {
            this.PropertyChanged(this, new PropertyChangedEventArgs(PropertyName));
        }
    }

}

並且SelectedEmployees類是

public class Employee
{
    [Key]
    public int id { get; set; }
    public DateTime JoiningDate { get; set; }
    public string name { get; set; }
    public string gender { get; set; }
    public string mobile { get; set; }
    public string post { get; set; }
    public string salaryType { get; set; }
    public decimal salary { get; set; }
    public string docname { get; set; }
    public int validit { get; set; }
}

我懷疑SelectedEmployees.gender不是comboboxitem類型。
直接使用在組合框中創建組合框項目的捷徑是一個錯誤的舉動。

當我做:

    xmlns:sys="clr-namespace:System;assembly=mscorlib">
<Window.DataContext>
    <local:MainWIndowViewModel/>
</Window.DataContext>
<Window.Resources>
    <x:Array Type="sys:String" x:Key="Genders">
        <sys:String>Male</sys:String>
        <sys:String>Female</sys:String>
    </x:Array>
</Window.Resources>
<Grid>
    <ComboBox 
     SelectedItem="{Binding gender, Mode=TwoWay}" 
        ItemsSource="{StaticResource Genders}"
        />
</Grid>

在綁定的性別中,我得到的是字符串而不是comboboxitem。 您可能想要更多類似的東西。

這可能是最好的方法,特別是如果您要學習MVVM:對Gender使用枚舉類型。 “ LOL”從來都不是有效的性別,因此不要讓任何人嘗試使用它。 通過將ComboBox綁定到靜態集合來填充它。 SelectedEmployees.gender初始化為您想要作為默認值的值,綁定將完成其余工作。

<ComboBox 
    SelectedItem="{Binding SelectedEmployees.gender}" 
    ItemsSource="{Binding SelectedEmployees.Genders}"
    /> 

C#

public class SelectedEmployeesViewModel : ViewModelBase
{
    /* ...other stuff... */

    private Gender _gender = Gender.Male;
    public Gender gender
    {
        get { return _gender; }
        set
        {
            if (value != _gender)
            {
                _gender = value;
                OnPropertyChanged();
            }
        }
    }
}

public enum Gender
{
    Male, Female
}

public static class EnumValues
{
    public static IEnumerable<Gender> Genders => Enum.GetValues(typeof(Gender)).Cast<Gender>();
}

還有其他方法。 我建議不要使用字符串,但這至少是說明性的:

    private String _gender = "Male";
    public String gender
    {
        get { return _gender; }
        set
        {
            if (value != _gender)
            {
                _gender = value;
                OnPropertyChanged();
            }
        }
    }

您的SelectedEmployees類是否實現INotifyPropertyChanged ,並且SelectedEmployees.gender的值更改時是否引發PropertyChanged

擺脫綁定上的Mode=TwoWay 您無需明確地執行此操作。 這是放置在ComboBox.SelectedValueComboBox.SelectedItem上的任何綁定的默認值。

正如Andy在評論中指出的那樣,您的SelectedValue和SelectedItem都將是ComboBoxItem實例,因為這就是填充ComboBox的方式。 所需的字符串在ComboBoxItems的Content屬性中,因此請使用SelectedValuePath告訴ComboBox有關此內容,並綁定到SelectedValue屬性。 SelectedItem將是ComboBoxItem本身,對您沒有用。

<ComboBox 
    SelectedValue="{Binding SelectedEmployees.gender}" 
    SelectedValuePath="Content"
    >
    <ComboBoxItem Content="Male" />
    <ComboBoxItem Content="Female" />
</ComboBox>

這是另一種方法:用字符串填充ComboBox。

<ComboBox 
    SelectedItem="{Binding SelectedEmployees.gender}" 
    xmlns:sys="clr-namespace:System;assembly=mscorlib"
    >
    <sys:String>Male</sys:String>
    <sys:String>Female</sys:String>
</ComboBox> 

有關通過ItemsSource用字符串填充ComboBox的另一種方法,請參見Andy的答案。

暫無
暫無

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

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