나는 데이터 그리드에서 사용자 입력을 확인하려고하는데, 내가하는 방식은 다음과 같습니다.
I) 사용자가 행을 추가하도록 허용
II) 사용자가 일부 셀을 채울 수 있도록 허용
III) EndEdit () 이벤트가 발생하면 모델을 업데이트합니다.
IV) Model을 업데이트 할 수없는 경우 (예 : 사용자가 NotNull 값을 제공하지 않은 경우) 오류가 발생합니다.
V) 여기에 이상한 부분이 있습니다! DataGrid의 잘못된 행에 머물고 싶지만 SelectedIndex 및 SelectedValue를 올바르게 설정 했음에도 불구하고 강조 표시된 행이 변경됩니다.
내 XAML은 다음과 같습니다.
<DataGrid x:Name="gd_Contacts" SelectedItem="{Binding SelectedContact,Converter={StaticResource NewPlaceConverter}}"
SelectedIndex="{Binding SelectedItemIndex}"
Margin="0,5,1,0" ItemsSource="{Binding ContactCollection, Mode=TwoWay}"
CanUserAddRows="True" CanUserDeleteRows="False" AutoGenerateColumns="False" Grid.Column="1">
내 ViewModel은 다음과 같습니다.
private ObservableCollection<ActionEnabledContacts> FContactCollection;
//....
public ActionEnabledContacts SelectedContact //THE PROPERTY FOR SELECTEDITEM
{
get { return FSelectedContact; }
set
{
//
List <ActionEnabledContacts> InvalidList=ContactCollection.Where<ActionEnabledContacts>(p => p.cnt_Key == 0).ToList();
if (InvalidList != null && InvalidList.Count > 0)
{
//now find index of that bastard
List<ActionEnabledContacts> AllContacts = ContactCollection.ToList();
int BastardIndex = 0;
foreach (ActionEnabledContacts AContact in AllContacts)
{
if (AContact.cnt_Key == 0)
{
FSelectedContact = InvalidList[0];
NotifyPropertyChanged();
SelectedItemIndex = BastardIndex;
//^^^^ THIS LINE DO UPDATE SELECTEDINDEX AND CALL NotifyPropertyChanged()
}
BastardIndex++;
}
}
else
{
//
FSelectedContact = value;
NotifyPropertyChanged();
}
}
}
선택이 변경되는 동안에는 선택을 변경할 수 없습니다 ... 그게 이해가된다면 : P
선택 사항이 방금 변경된 경우 다시 프로그래밍 방식으로 변경할 수있을 때까지 기다려야합니다. 이것은 일반적으로 Dispatcher.BeginInvoke
Dispatcher 대기열에 호출을 추가 하는 데 사용 되므로 현재 선택이 처리 된 후에 실행됩니다.
if (AContact.cnt_Key == 0)
{
FSelectedContact = InvalidList[0];
NotifyPropertyChanged();
Application.Current.Dispatcher.BeginInvoke(new Action(() =>
SelectedItemIndex = BastardIndex));
}
BastardIndex++;
MVVM 또는 여러 UI 스레드 시나리오에서 뷰 모델에서이 작업을 수행하는 것이 정확히 최상의 솔루션은 아닙니다. 해당 줄에서 이벤트를 발생시키고 (내부 인덱스 전달 EventArgs
)보기에서 해당 이벤트를 구독하고 이벤트 처리기에서 Dispatcher 호출을 실행 ( this.Dispatcher
대신 사용 Application.Current.Dispatcher
) 할 수 있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다