私は自分のビューモデルに接続するビューを持っています。ユーザーが選択したアイテムをビューから変更すると、選択したアイテムに追加するデータを取得します。選択したアイテムを更新した後でプロパティ自体を呼び出さないと、結果はUIで更新されません。これは明らかに意図された実装ではありませんが、プロパティがどのように通知されるかは不明です。WPFデータバインドが必要です。手動で起きる必要があります
複数のコントロールにバインドするバッキングプロパティを次に示します。ここで
public Break SelectedData
{
get { return _selectedData; }
set
{
if (_selectedData!= value && value != null)
{
_selectedData= value;
DeviceName = value.Feeder;
OnPropertyChanged("SelectedData");
}
}
}
はのviewmodelで非同期コマンドに対話トリガをバインドするコンボボックスである:のviewmodelで
<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が設定されている場合、追加のデータを追加するために、私の非同期関数を実行します:
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;
}
}
'UpdateSourceTrigger = Explicit'を使用 – JohnyL
「プロパティ自体を上げる」コード内の行を指定できますか? –
@GregNあなたのセッターは呼び出されていないので、イベントは発生しません。あなたのコマンドでは、 'SelectedData'を変更するだけで置き換えません。そのように実装したままにすると、バインディングを更新するためにイベントを自分で起動する必要があります。 – JSteward