我有一个这样的课程:
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();
答案 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)
有很多方法可以做到这一点:
有点破解,但您可以反转项目的顺序并绑定到SelectedIndex而不是SelectedItem。当然,如果您需要不同的数字或需要特定的订单,这不起作用。
您可以在视图模型中使用字符串和int属性列出“State”对象,而不是静态声明这两个选项。然后,您可以将组合框的ItemsSource设置为此集合,并且视图模型中的“State”属性将更改为此新类型。您可以将组合框的“DisplayMemberPath”属性设置为字符串属性。然后你可以从SelectedItem中获取int。这可能是最容易扩展的解决方案。你甚至可以使用枚举而不是int(更易读)。
将“State”属性设为对象(甚至是String),并在其setter中,检查两个标签。根据它的标签,将“real”int属性设置为正确的值。
就个人而言,如果你认为你可能有另一个状态,我会选择第二条路线,并使用枚举而不是直接的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; }
}
}