2017-04-25 6 views
-1

テーブルの列に存在しない要素のみをコンボボックスに表示したいとします。コンボボックスにテーブルにない要素のみを表示する方法C#

マイテーブル:

<DataGrid Grid.Row="1" ItemsSource="{Binding MainRows, ValidatesOnDataErrors=True}" 
    CanUserAddRows="True" 
    > 
<DataGrid.Columns> 
    <DataGridTemplateColumn Width="2*" Header="Agent" > 
     <DataGridTemplateColumn.CellTemplate > 
      <DataTemplate> 
       <ComboBox 
        SelectedItem="{Binding Item, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}" 
        ItemsSource="{Binding Path=DataContext.AvaibleAgents, RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type UserControl}}}"> 
       <ComboBox> 
      </DataTemplate> 
     </DataGridTemplateColumn.CellTemplate> 
    </DataGridTemplateColumn> 

ユーザーエージェントに一つだけの時間を追加することができます。コンボボックスの項目から削除する、それらは行の

public class MainDocumentVM : CCRDocumentVM 
{ 
    public MainDocumentVM(CCRMainDocument innerValue) : base(innerValue) 
    { 
    } 

public List<MainRowVM> _MainRows; 
public List<MainRowVM> MainRows 
{ 
    get 
    { 
     //TODO: Refactor it ASAP 
     if (MainRows == null) 
     { 
      _ccrMainRows = (InnerValue as MainDocument).MainRows.Select(x => new MainRowVM(x)).ToList(); 
     } 
     return _MainRows.Where(x=>x.InnerValue.IsActive).ToList(); 
    } 
} 
#region Functionality 
private MainRowVM _selectedRow; 

public MainRowVM SelectedRow 
{ 
    get { return _selectedRow; } 
    set 
    { 
     _selectedRow = value; 
     OnPropertyChanged(); 
    } 
} 


public ICommand AddNewRowCommand 
{ 
    get 
    { 
     return Commands.GetOrCreateCommand(() => AddNewRowCommand,(() => AddNewRow(CCRMainRow.CreateNew<MainRow>()))); 
    } 
} 


public void AddNewRow(MainRow row) 
{ 
     (InnerValue as MainDocument).CCRMainRows.Add(row); 
     if (_MainRows != null) 
     { 
      MainRows.Add(new MainRowVM(row)); 
     } 
     OnPropertyChanged(nameof(MainRows)); 
     //OnPropertyChanged(nameof(AvaibleItems)); 
} 

public List<Agents> AvaibleAgents 
{ 
    get 
    { 
     return ManagerFactoryResolver.CurrentFactory.CCRAgentsManager.AllValues 
      .ToList(); 
    } 
} 

}

私のViewModel DataGrid内 私のDataContextのVMを存在:

public class MainRowVM : EditableDataVM<MainRow> 
{ 
    public MainRowVM(MainRow innervalue) : base(innervalue) 
    { } 

    public Agent Agent 
    { 
     get 
     { 
      return ManagerFactoryResolver.CurrentFactory.AgentManager 
       .AllValues.FirstOrDefault(x => x.Id == InnerValue.AgentID); 
     }  
     set 
     { 
      InnerValue.AgentID = value.Id; 
      OnPropertyChanged(); 
     } 
    } 
+0

MVVMを使用していますか?あなたのViewModelコードも投稿してください – ganeshran

+0

あなたの質問は広すぎます。しかし、 'AvaibleAgents'コレクションの' CollectionViewSource'を見て、フィルタリングを行うことができます。 –

+0

申し訳ありませんが、今はVMを追加しようとしています。 あなたのアドバイスは、私が必要としているもののように見えます –

答えて

0

あなたがでAvailableAgentsリストを更新する必要がありますユーザーがエージェントを追加するたびにVMが追加されました...

0

あなたが選択するロジックでこれらの要素を除外する必要がありますViewModelでプロパティ(たとえば、ExcludedItemsというプロパティ)で公開し、ComboBox.ItemsSourceをそのプロパティにバインドします。コレクション/テーブルを更新するたびに、そのプロパティで変更されたプロパティを上げて、ComboBoxの変更も反映させます。

ただし、バインディング時には、必ずしも現在のDataContextは常にデータコンテキストであるため、プレフィックスはDataContext.という接頭辞を使用する必要はありません。

+0

コレクションからコンボボックスリストの項目を削除すると、コンボボックスで表示されなくなり、例外がスローされます。 –

+0

例外はありますか? –

+0

私はセントアイテムアイテムから削除します。もしそれらが行にバインドされていれば。 DataGridに追加すると、データソースから削除されるので、 "selected item is null"のようになります。 Paradox) –

関連する問題