マスター/詳細ビューを備えた wpv/mvvm-light/vb.net アプリケーションがあります。このビューには、クライアントのリストボックスと、ユーザーが顧客を表示および編集できるクライアントの詳細の詳細ビューがあります。
リストボックスで新しいクライアントが選択されたときに、ユーザーが変更を保存するように求められる機能を追加したかったのです。ユーザーがメッセージ ボックスから [はい] を選択した場合は変更を保存し、そうでない場合は変更を破棄して以前に選択したアイテムを元の値に戻します。私はこれですべて正常に動作しています。
私の問題は、ユーザーが新しいクライアントを選択し、メッセージボックスが変更を保存するように要求すると、リストボックスが同期しなくなることです。リストボックスには選択された新しいクライアントが表示されますが、詳細ビューには以前のクライアントが表示されます。奇妙なことは、まれに適切に機能することです。
以下は私の見解です。
<UserControl x:Class="FTC.View.ClientListView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:FTC_Application"
mc:Ignorable="d"
d:DesignHeight="400" d:DesignWidth="900">
<ListBox
Grid.Column="1"
Width="350"
Style="{DynamicResource FTC_ListBox}"
ItemTemplate="{DynamicResource FTC_ClientListTemplate}"
ItemContainerStyle="{DynamicResource FTC_ListItem}"
ItemsSource="{Binding ClientViewSource.View}"
SelectedItem="{Binding Path=Selection, Mode=TwoWay}"
/>
<ContentControl DataContext="{Binding Path=Selection, Mode=TwoWay}" >
<!--all the display stuff goes here for the detail view-->
</ContentControl>
</UserControl>
以下は、リストボックスの選択された項目がバインドされているビューモデルのプロパティです。詳細を表示するコンテンツ コントロールのバインドでもあります。
Public Property Selection As client
Get
Return Me._Selection
End Get
Set(ByVal value As client)
''capture current value of selection
_PreviousClient = _Selection
''If they are the same,
If value Is _PreviousClient Then
Return
End If
' Note that we actually change the value for now.This is necessary because WPF seems to query the
' value after the change. The list box likes to know that the value did change.
If Me._Selection.HasChanges = True And _Selection.HasErrors = False Then
'If HasChangesPrompt(value) = True Then
' ''user rejects saving changes, exit property
' Return
'End If
If FTCMessageBox.Show("Do you want to save your changes", "Unsaved Changes", MessageBoxButton.YesNo, MessageBoxImage.Warning) = MessageBoxResult.No Then
''SELECTION IS CANCELLED
' change the value back, but do so after the UI has finished it's current context operation.
Application.Current.Dispatcher.BeginInvoke(New Action(Sub()
'' revert the current selected item to its original values and reset its HasCHanges tracking
objHelper.CopyProperties(_OriginalClient, _Selection)
_Selection.HasChanges = False
RaisePropertyChanged(ClientSelectedPropertyName)
''continue with listbox selection changing to the new value for selection
_ClientCollectionViewSource.View.MoveCurrentTo(value)
End Sub), DispatcherPriority.Normal, Nothing)
Return
Else
''save changes to database
SaveExecute()
End If
End If
_Selection = value
_Selection.HasChanges = False
RaisePropertyChanged(ClientSelectedPropertyName)
''clone the unchanged version of the current selected client on na original variable
objHelper.CopyProperties(_Selection, _OriginalClient)
End Set
End Property
SO の考え方は、ユーザーが変更を保存したくない場合、クライアントの元の値が (リフレクションを使用して) 現在の値にコピーされ、その後、UI が更新され、ユーザーが選択した新しい値まで選択が続行されるというものです。 . ただし、上で述べたように、次の行でハードコードするのにうんざりしているにもかかわらず、リストボックスにはこの変更が反映されません。
''continue with listbox selection changing to the new value for selection
_ClientCollectionViewSource.View.MoveCurrentTo(value)
ここに投稿されたソリューションをカスタマイズすることで、このソリューションを取得しました
これが発生したときにリストボックスが同期しなくなる理由を誰かが理解するのを手伝ってくれますか?
前もって感謝します