WPF:将ComboBox数据绑定到int值
本文关键字:int 数据绑定 ComboBox WPF | 更新日期: 2023-09-27 17:50:05
我有一个这样的类:
public class Service
{
public int State { get; set; }
}
如何将其绑定到组合框,使组合框显示"活动"/"非活动",状态变为1或0?
<ComboBox SelectedItem="{Binding Path=State}">
<ComboBoxItem Content="Active" Tag="1" IsSelected="True"/>
<ComboBoxItem Content="Inactive" Tag="0" />
</ComboBox>
我正在使用DataContext form.DataContext = new Service();
将对象绑定到表单
首先,Tag属性只保存您给它的任何数据,它对SelectedItem的绑定没有任何贡献。如果ComboBoxItems没有数据上下文,你可以这样做,试试:
<ComboBox SelectedValue="{Binding Path=State}" SelectedValuePath="Tag">
<ComboBoxItem Content="Active" Tag="1" IsSelected="True"/>
<ComboBoxItem Content="Inactive" Tag="0" />
</ComboBox>
通常您会使用值转换器,但在这种情况下,您可以很容易地使用字典。
像这样的东西应该起作用:
public class Service
{
public Dictionary<int,string> StateDictonary {get;set;}
public Service()
{
StateDictonary = new Dictionary<int,string>();
StateDictonary[1] = "Active";
StateDictonary[0] = "Inactive";
}
}
然后在xaml中,你会做一些类似的事情:
<ComboBox ItemsSource="{Binding StateDictonary }" DisplayMemberPath="Value" SelectedValuePath="Key" />
我现在在家,所以我不能测试这个。所以让我知道它是否不工作
有很多方法可以做到这一点:
-
有点破解,但你可以颠倒项目的顺序,绑定到SelectedIndex而不是SelectedItem。当然,如果你需要不同的号码或需要特定的订单,这是行不通的。
-
您可以在视图模型中拥有一个包含字符串和int属性的"State"对象列表,而不是静态地声明这两个选项。然后,您可以将组合框的ItemsSource设置为此集合,并且视图模型中的"State"属性将更改为此新类型。您可以将组合框的"DisplayMemberPath"属性设置为字符串属性。然后您可以从SelectedItem中获取int。这可能是最容易扩展的解决方案。您甚至可以使用枚举而不是int(更可读(。
-
使"State"属性成为一个对象(甚至是一个String(,在它的setter中,对照您的两个标签进行检查。根据它是哪个标签,将"real"int属性设置为正确的值。
就我个人而言,如果你认为你可能有另一个状态,我会走第二条路,使用枚举而不是直接的int。如果你愿意,我可以提供一个例子。
您想要为ComboBox
创建一个对象作为ItemsSource
。由于您在ComboBox
中定义了项,因此其ItemsSource
的基础数据类型是ComboBoxItem
,并且对SelectedItem
进行绑定将其映射到基础数据类型。由于您正在尝试数据绑定一个int
的值,该值不是组合框的ItemsSource
的数据类型,因此无法工作。
要做到这一点,我会做一些类似的事情
public class Service
{
private State _selectedState;
private readonly ObservableCollection<State> _states = new ObservableCollection<State>() { new State() { Value = "Active", IsSelected = true} ,new State() {Value = "Inactive" }};
public State SelectedSelectedState
{
get { return _selectedState; }
set
{
_selectedState = value;
BitState = _selectedState.Value == "Active" ? 1 : 0;
}
}
public int BitState { get; set; }
public class State
{
public bool IsSelected { get; set; }
public string Value { get; set; }
}
public ObservableCollection<State> States
{
get { return _states; }
}
}
在主窗口上
public MainWindow()
{
InitializeComponent();
comboBox.DataContext = new Service();
}
如果你不想要这种控制,那么你可以做这样的事情,
public enum State
{
Inactive,
Active,
}
public class Service
{
private readonly ObservableCollection<State> _states = new ObservableCollection<State>() { State.Inactive, State.Active };
private int _selectedValue;
public int SelectedValue
{
get { return _selectedValue; }
set { _selectedValue = value; }
}
public ObservableCollection<State> States
{
get { return _states; }
}
}
以及您的XAML
<ComboBox x:Name="blah" SelectedIndex="{Binding Path=SelectedValue, Mode=TwoWay}" ItemsSource="{Binding States}"/>