如何将对象绑定到ComboBox,但更改时更新另一个对象?

时间:2012-04-25 15:37:03

标签: c# wpf xaml binding combobox

我有一个包含

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。这可能吗?

如果是这样,我该如何实现呢?如果没有,对我来说,有什么比我目前正在做的更好的方式吗?

2 个答案:

答案 0 :(得分:0)

我相信这就像改变你的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>

假设数据上下文设置正确,您可能需要在某个时刻将组合框的datacontext设置为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,这可能会起到字典的作用)

答案 1 :(得分:0)

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

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

在你的usercontrols DataContext中。