1

2つのコンボボックスがあるとします。1つは下限値用、もう1つは上限値用です。ユーザーは両方の値を選択する必要があります。彼女が快適に過ごせるように、upper-value-comboboxの値を制限することで、エラー(lower> upper)を防ぎたいと思います。

<例>

ここに例があります。(この例では、整数を使用しています。実際の問題にはさまざまなオブジェクトがあります。)

  1. ユーザーは[1..5]の範囲内で選択できます。

    lower: [1, 2, 3, 4, 5]  --> no lower-value selected
    upper: [1, 2, 3, 4, 5]  --> no upper-value selected
    
  2. 彼女が下限値として3を選択した場合、上限チェックボックスに値[3..5]のみを指定するようにします。これは、上位コンボボックスのデータバインドされたObservableCollection<MyObj>を変更することで正常に機能します。

    lower: [1, 2, __3__, 4, 5]  --> User has selected '3'
    upper: [3, 4, 5]            --> after that, only values within the range [3..5] are available.
    
  3. ユーザーは上限値として4を選択します

    lower: [1, 2, __3__, 4, 5]  --> User has selected '3'
    upper: [3, __4__, 5]        --> User has selected '4'
    
  4. ユーザーは気が変わって、低い値として2を選択します

    lower: [1, __2__, 3, 4, 5]  --> User has selected '2'
    upper: [2, 3, __4__, 5]     --> '4' should be kept selected
    

</ example>

Windowsフォームの世界では、ユーザーコントロールを作成し、イベント処理を自分で制御していました。実際、上位コンボボックスのイベントの処理をオフにし、SelectedIndexChangedその基になるリストを調整し、適切なインデックスを設定して、イベント処理を再びオンにします。

4番目のステップで奇妙な問題が発生しました。基になるコレクションを変更している間、選択した値を保持する方法が見つかりませんでした。

  • このような懸念に対処するためのmvvm-wayは何ですか?または、mvvm-patternは私のシナリオに適した薬ではありませんか?
  • これは、イベント処理を完全に制御できるユーザーコントロールに適した場所ですか?
  • Expression-Blendは本当にmvvm-patternを使用して構築されていますか?;-)
4

2 に答える 2

2

毎回新しい上位コレクションを作成する代わりに、単にICollectionView.Filterを使用してみませんか?選択したアイテムを保持できるようにします。

編集:速くて汚い例;)

public class MyCbo
{
    private int _selectedInt;
    public int SelectedInt
    {
        get { return _selectedInt; }
        set { _selectedInt = value; 
        this.view.Refresh();}
    }

    public List<int> MyFirst { get; set; }
    public List<int> MySecond { get; set; }

    private ICollectionView view;

    public MyCbo()
    {
        this.MyFirst = new List<int>() {1, 2, 3, 4, 5};
        this.MySecond = new List<int>() { 1, 2, 3, 4, 5 };

        this.view = CollectionViewSource.GetDefaultView(this.MySecond);
        this.view.Filter = Myfilter;
    }

    private bool Myfilter(object obj)
    {
        var item = Convert.ToInt32(obj);

        var upper = this.SelectedInt;

        if (item < upper)
            return false;

        return true;
    }
}

ユーザーコントロール

public partial class Comboxtwo : UserControl
{
    private MyCbo data;
    public Comboxtwo()
    {
        this.data = new MyCbo();
        InitializeComponent();
        this.DataContext = data;
    }
}

xaml

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition />
        <ColumnDefinition  />
    </Grid.ColumnDefinitions>
    <ComboBox Grid.Column="0" ItemsSource="{Binding MyFirst}" SelectedItem="{Binding SelectedInt, Mode=OneWayToSource}" Height="30"/>
    <ComboBox Grid.Column="1" ItemsSource="{Binding MySecond}" Height="30" />
</Grid>
于 2012-05-04T13:29:29.773 に答える
-1

作業の方向性を示すだけです。これは、BindableLinqで解決できるもののように聞こえます。これにより、MVVMに忠実であり、必要に応じて柔軟に対応できます。

詳細が必要な場合は、コメントしてください。

于 2012-05-04T13:27:06.700 に答える