0

SeiveList という名前の ObservableCollection があります。リストからすべての SeiveIdSize を取得し (最後のものは役に立たないため)、Combobox の DataContext を設定します。追加した

seiveCmb.DataContext = GlobalUtils.SeiveList;
seiveCmb.DisplayMemberPath = // WHAT SHOULD GO HERE. hOW TO ONLY SHOW SeiveIdSize

// XML 
<ComboBox Name="seiveCmb" ItemsSource="{Binding}"  Grid.Column="1" Grid.Row="1" Margin="2" SelectedIndex="0" ></ComboBox>

セバスチャンの提案に従って編集:現在、コンボボックスのリストを試してみました。私のSeiveクラス:

public class Seive : INotifyPropertyChanged 
{
   // Other Members
   private bool isSelected;

           public bool IsSelected
    {
        get { return isSelected; }
        set
        {
            isSelected = value;
            OnPropertyChanged("IsSelected");
        }
    }

    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string p)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
            handler(this, new PropertyChangedEventArgs(p));
    }
 }

私の Window .xaml ファイルで:

    <Window.Resources>
    <CollectionViewSource Source="{Binding Path=comboSeives}"
                          x:Key="comboSeivesFiltered"
                          Filter="ComboSeiveFilter">            
    </CollectionViewSource>
</Window.Resources>

 <ComboBox Name="seiveCmb" ItemsSource="{Binding Source={StaticResource         comboSeivesFiltered}}" DisplayMemberPath="SeiveIdSize"
                      Grid.Column="1" Grid.Row="1" Margin="2" SelectedIndex="0"
                      ></ComboBox>

ウィンドウ内.csファイル:

    public ObservableCollection<Seive> comboSeives { get; set; }

    // Initial original data in Window_Loaded method
    comboSeives = GlobalUtils.SeiveList;

    public void ComboSeiveFilter(object sender, FilterEventArgs e)
    {
        Seive sv = e.Item as Seive;
        // Add items those is != "TOTAL" and isSelected == false
        if (sv.SeiveIdSize != "TOTAL" && sv.IsSelected == false)
            e.Accepted = true;
        else
            e.Accepted = false;
    }

ID が "TOTAL" の場合、または isSelected が false (つまり、グリッドに追加されていない) の場合、true のみが返され、グリッドに追加されます。初期のすべてのレコードは isSelected = false です。

これは、このサイトの説明とヘルプから私が理解したことです。これを実装しました。しかし、ランタイムでは、コンボボックスに何も表示されません。フィルターメソッドにブレークを追加してデバッグしようとしましたが、そこに到達することはありません。上記のコードからどこが間違っているか指摘していただけますか。

どんな助けも感謝しています。

ありがとう

4

1 に答える 1

1

コレクションをフィルタリングして、1つの要素を削除する必要があることを理解しました。これを行う1つの方法は、Window.ResourcesにCollectionViewを作成し、フィルターメソッドを適用することです-ここで示され、説明されています。

<Window.Resources>
    <CollectionViewSource Source="{Binding Path=SeiveList}"
                          x:Name="seiveListFiltered"
                          Filter="MyFilter">

    </CollectionViewSource>
</Window.Resources>

あなたのコードは、あなたの場合、コレクションがウィンドウのDataContextであることをほのめかしています。これは、新しいリソースに一致するように変更する必要があります。

<ComboBox ItemsSource="{Binding Source={StaticResource seiveListFiltered}}"/>

これにより、ComboBoxがSeiveItem.ToString()-メソッドの出力に似たアイテムでいっぱいになることに注意してください(実際には、アイテムのクラス名はわかりません)。DisplayMemeberPath-Propertyを使用して、代わりに表示するプロパティの名前を設定します。

<ComboBox DisplayMemberPath="SeiveIdSize" ItemsSource="{Binding Source={StaticResource seiveListFiltered}}"/>
于 2012-05-18T08:56:18.113 に答える