0

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. これは可能ですか?

もしそうなら、どうすればこれを実装できますか?そうでない場合、私が現在行っていることよりも、これを行うためのより良い方法はありますか?

4

2 に答える 2

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

あなたのユーザーコントロールDataContextで。

于 2012-04-25T16:10:16.937 に答える
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>

データコンテキストが正しく設定されていると仮定すると、おそらくコンボボックスのデータコンテキストをゾーンオブジェクトに設定する必要があり、おそらくコンストラクターと一緒に渡す必要があります...

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 であることがわかりました。これはおそらく辞書として機能します)

于 2012-04-25T15:39:48.277 に答える