Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#WPF-组合框数据绑定_C#_Wpf_Xaml_Data Binding_Combobox - Fatal编程技术网

C#WPF-组合框数据绑定

C#WPF-组合框数据绑定,c#,wpf,xaml,data-binding,combobox,C#,Wpf,Xaml,Data Binding,Combobox,我试图理解将组合框与对象数据绑定的概念 我有以下课程: public class employmentApplication { private byte appType = 0; // 1 = normal; 2 = expedited public byte AppType { get { return appType ; } set { appType = value; this.OnPropertyChanged("AppTy

我试图理解将组合框与对象数据绑定的概念

我有以下课程:

public class employmentApplication
{
  private byte appType = 0; // 1 = normal; 2 = expedited

  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));
  }
}
我的组合框的xaml是

<ComboBox>
  <ComboBoxItem Content="Normal" />
  <ComboBoxItem Content="Expedited" />
</ComboBox>

我不确定从何处开始将combobox绑定到AppType,因为它必须将它从字符串(“普通”、“加急”)转换为字节(0,1),然后返回到对象和combobox之间


提前谢谢你的帮助

您可以通过几种方法来实现这一点,但这里有一个简单的解决方案来满足您的要求。注意,
DataContext
需要设置为要表示的类的实例

<ComboBox SelectedValue="{Binding AppType, Mode=TwoWay}"
          SelectedValuePath="Tag">
    <ComboBoxItem Content="Normal" Tag="0"/>
    <ComboBoxItem Content="Expedited" Tag="1"/>
</ComboBox>
现在修改属性以使用枚举

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

        OnPropertyChanged( "AppType" );
    }
}
现在您可以使用我上面的示例,但使用枚举:

<ComboBox SelectedValue="{Binding AppType, Mode=TwoWay}"
          SelectedValuePath="Tag">
    <ComboBoxItem Content="Normal" Tag="{x:Static local:AppType.Normal}"/>
    <ComboBoxItem Content="Expedited" Tag="{x:Static local:AppType.Expedited"/>
</ComboBox>


下面是一个很好的例子,它可以稍微控制
组合框中显示的内容。但是,您也可以让它显示每个
enum
值,这很好,因为如果将来添加
enum
值,它们将自动显示在
组合框中。你可以用几种方法来做这件事,但是这里有一个简单的解决方案来解决你的问题。注意,
DataContext
需要设置为要表示的类的实例

<ComboBox SelectedValue="{Binding AppType, Mode=TwoWay}"
          SelectedValuePath="Tag">
    <ComboBoxItem Content="Normal" Tag="0"/>
    <ComboBoxItem Content="Expedited" Tag="1"/>
</ComboBox>
现在修改属性以使用枚举

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

        OnPropertyChanged( "AppType" );
    }
}
现在您可以使用我上面的示例,但使用枚举:

<ComboBox SelectedValue="{Binding AppType, Mode=TwoWay}"
          SelectedValuePath="Tag">
    <ComboBoxItem Content="Normal" Tag="{x:Static local:AppType.Normal}"/>
    <ComboBoxItem Content="Expedited" Tag="{x:Static local:AppType.Expedited"/>
</ComboBox>


下面是一个很好的例子,它可以稍微控制
组合框中显示的内容。但是,您也可以让它显示每个
enum
值,这很好,因为如果将来添加
enum
值,它们将自动显示在
组合框中。有几种方法可以实现这一点。最简单的方法是使用ComboBox的SelectedIndex属性向AppType添加绑定
请注意,您应该添加
INotifyPropertyChanged
,以使绑定正常工作

在代码隐藏中执行以下操作

namespace WpfApplication8
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        employmentApplication  emp = new employmentApplication();  

        public MainWindow()
        {
            InitializeComponent();
            this.DataContext = emp;  
        }
    }
    public class employmentApplication:INotifyPropertyChanged
    {
        private byte appType = 0; // 1 = normal; 2 = expedited

        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));
        }
    }
}
名称空间WpfApplication8
{
/// 
///MainWindow.xaml的交互逻辑
/// 
公共部分类主窗口:窗口
{
employmentApplication emp=新employmentApplication();
公共主窗口()
{
初始化组件();
this.DataContext=emp;
}
}
公共类employmentApplication:INotifyPropertyChanged
{
私有字节appType=0;//1=normal;2=expedited
公共字节AppType
{
获取{return appType;}
设置
{
appType=值;
此.OnPropertyChanged(“AppType”);
}
}
公共事件属性更改事件处理程序属性更改;
void OnPropertyChanged(字符串propName)
{
if(this.PropertyChanged!=null)
这是我的财产改变了(
这是新的PropertyChangedEventArgs(propName));
}
}
}

有几种方法可以实现这一点。最简单的方法是使用组合框的SelectedIndex属性向AppType添加绑定 请注意,您应该添加
INotifyPropertyChanged
,以使绑定正常工作

在代码隐藏中执行以下操作

namespace WpfApplication8
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        employmentApplication  emp = new employmentApplication();  

        public MainWindow()
        {
            InitializeComponent();
            this.DataContext = emp;  
        }
    }
    public class employmentApplication:INotifyPropertyChanged
    {
        private byte appType = 0; // 1 = normal; 2 = expedited

        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));
        }
    }
}
名称空间WpfApplication8
{
/// 
///MainWindow.xaml的交互逻辑
/// 
公共部分类主窗口:窗口
{
employmentApplication emp=新employmentApplication();
公共主窗口()
{
初始化组件();
this.DataContext=emp;
}
}
公共类employmentApplication:INotifyPropertyChanged
{
私有字节appType=0;//1=normal;2=expedited
公共字节AppType
{
获取{return appType;}
设置
{
appType=值;
此.OnPropertyChanged(“AppType”);
}
}
公共事件属性更改事件处理程序属性更改;
void OnPropertyChanged(字符串propName)
{
if(this.PropertyChanged!=null)
这是我的财产改变了(
这是新的PropertyChangedEventArgs(propName));
}
}
}

最简单的方法是,如果正常值为0,加急值为1,则使用SelectedIndex进行绑定


最简单的方法是,如果正常值为0,加急值为1,则使用SelectedIndex进行绑定


我的建议是使用ValueConverter。它比使用标记值更灵活,而且它看起来很好,因为您在它自己的类中分离转换逻辑。我还注意到,在您的数据类中,您声明了PropertyChanged事件,但没有实现INotifyPropertyChanged接口,因此在这种情况下不能进行双向绑定。完整示例:

您的数据类(包括我的修复)

值转换器

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

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));
    } 
}
public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        DataContext = new EmploymentApplication();
    }
}
Xaml

<Window x:Class="WpfConvertion.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WpfConvertion"
    Title="MainWindow" Height="350" Width="525">
<Window.Resources>
    <local:AppTypeConverter x:Key="Converter"></local:AppTypeConverter>
</Window.Resources>
<Grid>
    <ComboBox Height="20" SelectedValue="{Binding AppType, Converter={StaticResource Converter}}" SelectedValuePath="Content">
        <ComboBoxItem>Normal</ComboBoxItem>
        <ComboBoxItem>Expedited</ComboBoxItem>
    </ComboBox>
</Grid>

正常的
加快


请注意这一行:xmlns:local=“clr namespace:WpfConvertion”。您必须在此处设置自己的命名空间,而不是我的WpfConvertion。

我的建议是使用ValueConverter。它比使用标记值更灵活,而且它看起来很好,因为您在它自己的类中分离转换逻辑。我还注意到,在您的数据类中,您声明了PropertyChanged事件,但没有实现INotifyPropertyChanged接口,因此在这种情况下不能进行双向绑定。完整示例:

您的数据类(包括我的修复)