C# WPF - ComboBox 数据绑定

20 浏览
0 Comments

C# WPF - ComboBox 数据绑定

我正在尝试理解将ComboBox与对象进行数据绑定的概念。

我有以下类:

public class employmentApplication
{
  private byte appType = 0; // 1 = 普通; 2 = 加急
  public byte AppType
  {
    get { return appType ; }
    set
    {
      appType = value;
      this.OnPropertyChanged("AppType");
    }
  }
  public event PropertyChangedEventHandler PropertyChanged;
  void OnPropertyChanged(string propName)
  {
    if (this.PropertyChanged != null)
      this.PropertyChanged(
      this, new PropertyChangedEventArgs(propName));
  }
}

我的ComboBox的XAML代码如下:


  
  

我不确定从哪里开始将我的ComboBox绑定到AppType,因为它需要在对象和ComboBox之间进行字符串("普通","加急")到字节(0,1)的转换。

提前感谢您的帮助!

0
0 Comments

问题原因:该问题的原因是数据类没有实现INotifyPropertyChanged接口,导致无法实现双向绑定。

解决方法:使用ValueConverter。ValueConverter是一种更灵活的解决方案,比使用Tag值更好,并且通过将转换逻辑分离到自己的类中,使代码更加清晰。以下是解决方案的完整示例:

首先,修改数据类,实现INotifyPropertyChanged接口,并在属性的set方法中调用OnPropertyChanged方法。

public class EmploymentApplication : INotifyPropertyChanged
{
    private byte appType = 0; // 1 = normal; 2 = expedited
    public byte AppType
    {
        get { return appType; }
        set
        {
            appType = value;
            OnPropertyChanged("AppType");
        }
    }
    public event PropertyChangedEventHandler PropertyChanged;
    void OnPropertyChanged(string propName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propName));
    } 
}

然后,创建一个Value Converter类,实现IValueConverter接口,并在Convert方法中根据值进行转换,在ConvertBack方法中根据显示文本进行转换。

public class AppTypeConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var b = (byte)value;
        if (b == 1) return "Normal";
        if (b == 2) return "Expedited";
        return string.Empty;
    }
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var strValue = (string) value;
        byte result = 0;
        if (strValue.Equals("Normal", StringComparison.Ordinal))
        {
            result = 1;
        }
        else if (strValue.Equals("Expedited", StringComparison.OrdinalIgnoreCase))
        {
            result = 2;
        }
        return result;
    }
}

接下来,在xaml.cs文件中,将数据类实例化,并将其设置为窗口的DataContext。

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        DataContext = new EmploymentApplication();
    }
}

最后,在XAML文件中,引用Value Converter并设置ComboBox的SelectedValue属性为数据类的AppType属性,并指定Converter参数为Value Converter的实例。



    


    
        Normal
        Expedited
    

注意:需要将xmlns:local="clr-namespace:WpfConvertion"这一行修改为自己的命名空间。

这样,问题就可以得到解决了。同时,Value Converter还可以根据不同的显示文本进行更动态的转换。

0
0 Comments

C# WPF - ComboBox数据绑定

在C# WPF中,ComboBox是一种常用的用户界面控件,用于显示下拉菜单并允许用户从列表中选择一个选项。ComboBox的数据绑定是将ComboBox的选中项与后端数据模型进行关联,以实现数据的双向绑定。

然而,在使用ComboBox进行数据绑定时,可能会遇到一些问题。其中一个常见的问题是,当ComboBox的数据源是一个整数类型的枚举值时,如何正确地进行数据绑定。

问题的原因是,当ComboBox的数据源是一个整数类型的枚举值时,ComboBox默认会将枚举值的名称作为显示文本。但是,在某些情况下,我们更希望将枚举值的整数值作为显示文本,而不是枚举值的名称。

解决这个问题的方法是使用SelectedIndex属性进行数据绑定。SelectedIndex属性表示ComboBox当前选中项在数据源列表中的索引位置。通过将SelectedIndex属性与后端数据模型中的整数值进行绑定,我们可以实现将整数值作为显示文本的效果。

下面是一个示例代码,演示了如何使用SelectedIndex属性进行数据绑定:


    Normal
    Expedited

在上述示例中,ComboBox的数据源是两个ComboBoxItem,分别表示"Normal"和"Expedited"两个选项。通过将SelectedIndex属性绑定到后端数据模型中的AppType属性,我们可以根据AppType的值自动选择ComboBox中的选项。

需要注意的是,由于SelectedIndex属性是从0开始的,因此在后端数据模型中,AppType属性的值应设置为0或1,分别对应于"Normal"和"Expedited"两个选项。

通过使用SelectedIndex属性进行数据绑定,我们可以轻松地将整数类型的枚举值与ComboBox关联起来,并将整数值作为显示文本。这样,我们就解决了在C# WPF中ComboBox数据绑定时遇到的问题。

0
0 Comments

问题的原因是想要在C# WPF中将ComboBox绑定到一个属性,然后根据选择的ComboBoxItem来设置该属性的值。解决方法是使用SelectedValue属性将ComboBox绑定到属性,并使用SelectedValuePath属性指定ComboBoxItem的属性来表示所选值。另外,使用枚举Enum来表示数据会更容易理解和管理。

在解决方法中,使用了以下代码:


    
    

其中SelectedValue属性绑定到了属性AppType,并且SelectedValuePath属性表示ComboBoxItem的属性Tag作为所选值。这是一个简单的解决方法,可以根据需要进行调整。

然后,使用枚举来表示数据,可以使代码更易于理解。首先,在一个新的文件中创建一个枚举AppType,如下所示:

public enum AppType
{
    Normal,
    Expedited
}

然后修改属性AppType的类型为该枚举类型:

public AppType AppType
{
    get
    {
        return appType;
    }
    set
    {
        if( Equals( appType, value ) ) return;
        appType = value;
        OnPropertyChanged( "AppType" );
    }
}

最后,可以使用以下代码将ComboBox绑定到该枚举:


    
    

以上解决方法可以实现将ComboBox绑定到属性,并根据所选的ComboBoxItem来设置属性的值。

0