【问题标题】:How to bind an object to a ComboBox, but update a different object when it changes?如何将对象绑定到 ComboBox,但在更改时更新不同的对象?
【发布时间】:2012-04-25 15:37:03
【问题描述】:

我有一个包含

Zone 对象
public int Block {get;set;}

我还有一个配置对象,其中包含最小和最大 Block 值,分别为 0 和 2。

我需要显示一个包含有效值范围的 ComboBox,但我需要将所选值绑定到 Block

对我来说最好的方法是什么?

我一直在尝试以下方法:

var blocks = new Dictionary<string, int>();
for (int i = _currentZone.Constraints.Block.Min; i <= _currentZone.Constraints.Block.Max; i++)
{
    blocks.Add("Block " + i, i);
}

var blocksCombo = new ComboBoxControl(blocks, GetCurrentBlockValue());

将 ComboBoxControl 定义为

public ComboBoxControl(Dictionary<string, int> comboItems, int? selectedValue)
{
    InitializeComponent();

    cboItems.ItemsSource = comboItems;
    cboItems.SelectedValue = selectedValue;
}

XAML 定义为

<Grid>

    <ComboBox x:Name="cboItems" 
              SelectionChanged="combo_SelectionChanged" 
              Height="25" 
              SelectedValuePath="Value">
        <ComboBox.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Path=Key}"/>
            </DataTemplate>
        </ComboBox.ItemTemplate>
    </ComboBox>

</Grid>

combo_SelectionChanged 事件被触发时,我手动更新Block 值,这并不理想。

我想要的是能够使用字典中的项目设置组合框,但是当我更改所选项目时,值绑定到不同的对象 - Block。这可能吗?

如果是这样,我该如何实施?如果没有,有没有比我目前正在做的更好的方法来解决这个问题?

【问题讨论】:

    标签: c# wpf xaml binding combobox


    【解决方案1】:

    我相信这就像改变你的 xaml 一样简单......

    <ComboBox x:Name="cboItems" 
              SelectionChanged="combo_SelectionChanged" 
              Height="25" 
              SelectedValuePath="Value"
              SelectedItem="{Binding Block}">
        <ComboBox.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Path=Key}"/>
            </DataTemplate>
        </ComboBox.ItemTemplate>
    </ComboBox>
    

    假设数据上下文设置正确,您可能需要在某个时候将组合框的数据上下文设置为您的 Zone 对象,也许将它与构造函数一起传递...

    var blocksCombo = new ComboBoxControl(blocks, GetCurrentBlockValue(), this);
    
    public ComboBoxControl(Dictionary<string, int> comboItems, int? selectedValue, Zone zone)
    {
        InitializeComponent();
    
        cboItems.ItemsSource = comboItems;
        cboItems.SelectedValue = selectedValue;
        cboItems.DataContext = zone;
    }
    

    编辑:

    另外我认为 Henk 是对的,您可能希望将字典更改为 Block 的 ObservableCollection。 (实际上刚刚实现的块只是一个int,这可能会用作字典)

    【讨论】:

      【解决方案2】:

      我希望我理解正确。您有组合框并想绑定到一个特定区域?

      <ComboBox ItemsSource="{Binding ValidValuesList}" ItemStringFormat="Block {0}" SelectedItem="{Binding MyZone.Block}"/>
      

      这绑定到

      public List<int> ValidValuesList
      {
          get { return new List<int> { 0, 1, 2 }; }
      }
      

      public Zone MyZone { get; set; }
      

      在您的用户控件 DataContext 中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-11-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多