簡體   English   中英

WPF:將ComboBox數據綁定到int值

[英]WPF: Databinding ComboBox to int value

我有一個這樣的課:

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

如何將其綁定到ComboBox,以便組合顯示“活動”/“非活動”,狀態變為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();將對象綁定到表單form.DataContext = new Service();

首先,Tag屬性只保存您提供的任何數據,它對SelectedItem的綁定沒有貢獻。 如果ComboBoxItems沒有datacontext,您可以這樣做,嘗試一下:

<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。 如果你願意,我可以提供一個例子。

您想要創建一個對象作為ComboBoxItemsSource 由於您在ComboBox定義了項目,因此基礎數據類型是其ItemsSourceComboBoxItem ,並對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; }
    }
}

在MainWindow上

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM