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接口,因此在这种情况下不能进行双向绑定。完整示例:
您的数据类(包括我的修复)