2017-12-13 18 views
0

私は自分のビューモデルに接続するビューを持っています。ユーザーが選択したアイテムをビューから変更すると、選択したアイテムに追加するデータを取得します。選択したアイテムを更新した後でプロパティ自体を呼び出さないと、結果は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; 
    } 
} 
+0

'UpdateSourceTrigger = Explicit'を使用 – JohnyL

+0

「プロパティ自体を上げる」コード内の行を指定できますか? –

+3

@GregNあなたのセッターは呼び出されていないので、イベントは発生しません。あなたのコマンドでは、 'SelectedData'を変更するだけで置き換えません。そのように実装したままにすると、バインディングを更新するためにイベントを自分で起動する必要があります。 – JSteward

答えて

3

SelectedDataを再割り当てしないため、コントロールは変更を認識しません。手動で自分が

場合には、あなたが例えばどこかにバインドするイベントを発生させるために持っている理由です

SelectedData.AttributesSelectedDataINotifyPropertyChangedが正しく実装されていない可能性があります。

+0

私はnotifypropertychangedで私のモデル(SelectedData)を完全にトンネルしなかったので、バックアップを通知していなかったようです。モデルを正しく実装しました。これで、手動でプロパティを上げることなく動作します。 – GregN

関連する問題