WPF:将ComboBox数据绑定到int值

时间:2014-03-12 18:00:15

标签: c# wpf data-binding

我有一个这样的课程:

public class Service
{
    public int State { get; set; }
}

如何将其绑定到ComboBox,以便组合显示" Active" /" Inactive"并且状态变为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();

将对象绑定到表单

4 个答案:

答案 0 :(得分:2)

首先,Tag属性只保存您提供的任何数据,它对SelectedItem的绑定没有贡献。如果ComboBoxItems没有datacontext,你可以这样做,试一试:

<ComboBox SelectedValue="{Binding Path=State}" SelectedValuePath="Tag">
    <ComboBoxItem Content="Active" Tag="1" IsSelected="True"/>
    <ComboBoxItem Content="Inactive" Tag="0" />
</ComboBox>

答案 1 :(得分:1)

通常你会使用value converter,但在这种情况下你可以轻松使用字典。

这样的事情应该有效:

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" />

我现在在家,所以我无法测试。所以,如果它不起作用,请告诉我

答案 2 :(得分:0)

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

  1. 有点破解,但您可以反转项目的顺序并绑定到SelectedIndex而不是SelectedItem。当然,如果您需要不同的数字或需要特定的订单,这不起作用。

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

  3. 将“State”属性设为对象(甚至是String),并在其setter中,检查两个标签。根据它的标签,将“real”int属性设置为正确的值。

  4. 就个人而言,如果你认为你可能有另一个状态,我会选择第二条路线,并使用枚举而不是直接的int。如果你愿意,我可以提供一个例子。

答案 3 :(得分:0)

您想要为ItemsSource创建一个ComboBox对象。由于您在ComboBox中定义了项目,因此基础数据类型为ComboBoxItem的{​​{1}}并对ItemsSource进行绑定,它会将其映射到基础数据类型。由于您尝试数据绑定SelectedItem的值,而该值不是无法工作的组合框int的数据类型。

要做到这一点,我会做这样的事情

ItemsSource

在MainWindow上

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();
}

和你的XAML

    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; }
        }
    }