2016-08-20 1 views
0

내 ViewModel에서 프로그래밍 방식으로 WPF DataGrid의 포커스와 강조 표시를 프로그래밍해야합니다. 데이터 격자는 하나의 열이 :.Net ItemCollection에서 IndexOf 개체를 얻는 방법

private IEnumerable<AdrTypeMdl> _itemsList; 
ItemsLcv = CollectionViewSource.GetDefaultView(_itemsList) as ListCollectionView; 

이 내가 데이터 필드 "DESCR"의 뷰 모델에 자체 속성 당이없는 경우에도 작동합니다

<DataGrid Name="DgAdrType" 
    ItemsSource="{Binding ItemsLcv}" 
    IsSynchronizedWithCurrentItem="True" 

    <DataGridTextColumn Header=" Description" 
    IsReadOnly="True" 
    CanUserSort="True" Binding="{Binding descr, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 

그리고 데이터 컨텍스트의 뷰 모델에

왜냐하면 DataGrid의 ItemSource를 바인딩하기 때문입니다. 뷰 모델 내가 지금처럼보기에서 해당 ItemCollection를 전달하여 항목의보기 데이터 그리드의 ItemCollection에 액세스 할 수 있습니다에서

:

<!-- Interaction for click selection --> 
<i:Interaction.Triggers> 
<i:EventTrigger EventName="GotMouseCapture"> 
<i:InvokeCommandAction Command="{Binding SelObjChangedCommand}" 
    CommandParameter="{Binding ElementName=DgAdrType, Path=Items}"/> 
    </i:EventTrigger> 
    </i:Interaction.Triggers> 

그리고 다시 뷰 모델에서, 정말 같은 데이터 그리드의 항목을로드 :

private ItemCollection _dgItems; 
private void SelObjChanged(object theItems) 
{if (theItems !=null) 
{ _dgItems = theItems as ItemCollection; 

해당 ItemCollection의 DataGrid 속성을 유지할 수 있도록 캐스팅을 ItemCollection에 유지하려고합니다. 문제는 ItemCollection의 IndexOf 메서드가 작동하지 않는다는 것입니다. 이 작업을 수행하여 클래스 개체 항목 중 하나의 인덱스를 찾으려고 할 때만 -1을 얻습니다.

var idx = _dgItems.IndexOf(myobject); 

편집 -------이 ------------------ 방법의 전체 코드는 IndesOf

private void HandleUpdateListEvent(Object myobject) 
{AdrTypeMdl theNewItem = myobject as AdrTypeMdl; 
bool co = _dgItems.Contains(theNewItem); 
var idx = _dgItems.IndexOf(theNewItem); 
_dgItems.MoveCurrentToPosition(idx); 
_dgItems.Refresh();} 

편집 시도이다 --------------- ------이 쉽게 접근하지만 난 여전히 λ/필터 식 및 방법 호출

// this is where I try to get the index of an object for highlighting 
private void HandleUpdateListEvent(Object myobject) 
AdrTypeMdl theNewItem = myobject as AdrTypeMdl; 
var e = ItemsLcv.SourceCollection.GetEnumerator(); 

ItemsLcv.Filter = o => (o == theNewItem); 
foreach (row in ItemsLcv) 
{ if row == theNewItem 
return e >; 
e = -1;} 
ItemsLcv.MoveCurrentToPosition(e); 
ItemsLcv.Refresh();} 

END 편집에 도움이 필요 ---------------

디버거에서 _dgItems 클래스 개체를 볼 수 있습니다. 내가 이것을하면 효과가있다.

 var idx = _dgItems.IndexOf(_dgItems[2]); 

그러나 매개 변수가 클래스 개체 인 경우 IndexOf 메서드가 작동하지 않습니다. 문제는 DataGrid 항목을 ItemCollection으로 캐스트 한 것입니다. 나는 Object 클래스를 형 변환 할 필요가있다. myObject를 DataGrid에서 가져온 ItemCollection에서 인식 할 수있는 항목으로 변경합니다. 해결 방법이 있습니까? 고맙습니다.

답변

0

시도해보십시오.

컬렉션 유형 (예 : AdrTypeMdl)으로 캐스팅해야합니다. 개체를 전달하여 인덱스를 가져올 수 없습니다. 소스 ItemsLcv에 바인딩되어 있습니다. 유형은 AdrTypeMd1입니다. 따라서 정확한 유형을 전달하여 정확한 색인을 얻으십시오.

var dgcolumn = myobject as AdrTypeMdl; 
if(dgcolumn != null) 
{ 
    var idx = _dgItems.IndexOf(dgcolumn); 
} 

idx은 해당 열의 색인이됩니다.

+0

네, 저도 시도해 보았습니다. 아래의 명시 적 선언을 시도했지만 여전히 idx는 -1이됩니다. AdrTypeMdl theNewItem = AdrTypeMdl로 페이로드. – harpagornis

+0

전체 코드를 게시하십시오. – ViVi

+0

전체 코드는 무엇입니까? 보기, ViewModel? – harpagornis

관련 문제