내 viewmodel에 연결하는보기가 있습니다. 사용자가 선택한 항목을보기에서 변경할 때마다 선택한 항목에 첨부 할 추가 데이터를 가져옵니다. 선택한 항목을 업데이트 한 후 속성 자체를 올리지 않으면 결과가 UI에서 업데이트되지 않습니다. 이것은 분명히 의도 된 구현이 아니지만 어쩌면 내가 속성이 어떻게 알려지는지에 대해 명확하지 않습니다.WPF 데이터 바인딩 필요 수동 레이즈
다음은 여러 컨트롤에 바인딩되는 배킹 속성입니다. 여기
public Break SelectedData
{
get { return _selectedData; }
set
{
if (_selectedData!= value && value != null)
{
_selectedData= value;
DeviceName = value.Feeder;
OnPropertyChanged("SelectedData");
}
}
}
는 뷰 모델에서 비동기 명령 작용 트리거 결합 콤보 경우 : selectionchangedcommand 설정할 때 뷰 모델에서
<ComboBox ItemsSource="{Binding Feeders}" DisplayMemberPath="OMSName" SelectedItem="{Binding SelectedData, Mode=TwoWay}" >
<i:Interaction.Triggers>
<i:EventTrigger EventName="SelectionChanged">
<i:InvokeCommandAction Command="{Binding SelectionChangedCommand}" CommandParameter="{Binding SelectedItem}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</ComboBox>
상기 selectionchangedcommand 추가 데이터를 추가하는 내 비동기 기능을 수행 :
SelectionChangedCommand = new RelayAsyncCommand(UpdateSelectedData); --In the constructor of the viewmodel
public async void UpdateSelectedData()
{
try
{
await _breakRepo.GetEventData(SelectedData);
if (SelectedData.AttachedEvent.IsOpen)
{
SelectedData.Attributes= new EventAttributes
{
TotalAffected = SelectedData.AttachedEvent.Attributes.TotalAffected,
TotalRestored = SelectedData.AttachedEvent.Attributes.TotalRestored,
TotalOut = SelectedData.AttachedEvent.Attributes.TotalOut,
TotalCritical = SelectedData.AttachedEvent.Attributes.TotalCritical,
TotalMajor = SelectedData.AttachedEvent.Attributes.TotalMajor
};
await _breakRepo.CallEventsAsync(SelectedData);
}
else
{
await _breakRepo.GetBreakByFeederAsync(SelectedData);
}
}
catch (Exception ex)
{
System.Windows.MessageBox.Show(ex.Message);
}
finally
{
//IF I ADD ONPROPERTYCHANGED("SelectedData") the other fields that bind
//to the values will update as expected
CurrentlySearching = true;
}
}
Use'UpdateSourceTrigger = Explicit' – JohnyL
코드에서 "속성 자체를 올리는"행을 나타낼 수 있습니까? –
@GregN 세터가 호출되지 않아 이벤트가 발생하지 않습니다. 명령에서'SelectedData' 만 바꾸면 바꾸지 않습니다. 그런 식으로 구현 한 채로두면 바인딩을 업데이트하기 위해 이벤트를 직접 실행해야합니다. – JSteward