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(); 将对象绑定到表单

WPF:将ComboBox数据绑定到int值

首先,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" />

我现在在家,所以我不能测试这个。所以让我知道它是否不工作

有很多方法可以做到这一点:

  1. 有点破解,但你可以颠倒项目的顺序,绑定到SelectedIndex而不是SelectedItem。当然,如果你需要不同的号码或需要特定的订单,这是行不通的。

  2. 您可以在视图模型中拥有一个包含字符串和int属性的"State"对象列表,而不是静态地声明这两个选项。然后,您可以将组合框的ItemsSource设置为此集合,并且视图模型中的"State"属性将更改为此新类型。您可以将组合框的"DisplayMemberPath"属性设置为字符串属性。然后您可以从SelectedItem中获取int。这可能是最容易扩展的解决方案。您甚至可以使用枚举而不是int(更可读(。

  3. 使"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}"/>