Skip to content

Commit ffaf616

Browse files
authored
Merge pull request #878 from skendrot/MasterDetailsSelectedItem
Allow SelectedItem to be set before control is loaded
2 parents e57e60a + 07e7a22 commit ffaf616

File tree

1 file changed

+31
-16
lines changed

1 file changed

+31
-16
lines changed

Microsoft.Toolkit.Uwp.UI.Controls/MasterDetailsView/MasterDetailsView.cs

Lines changed: 31 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ protected override void OnApplyTemplate()
7171
base.OnApplyTemplate();
7272

7373
_detailsPresenter = (ContentPresenter)GetTemplateChild(PartDetailsPresenter);
74+
SetDetailsContent();
7475

7576
SetMasterHeaderVisibility();
7677
}
@@ -86,22 +87,23 @@ protected override void OnApplyTemplate()
8687
private static void OnSelectedItemChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
8788
{
8889
var view = (MasterDetailsView)d;
89-
string noSelectionState = view._stateGroup.CurrentState == view._narrowState
90-
? NoSelectionNarrowState
91-
: NoSelectionWideState;
92-
VisualStateManager.GoToState(view, view.SelectedItem == null ? noSelectionState : HasSelectionState, true);
90+
if (view._stateGroup != null)
91+
{
92+
view.SetVisualState(view._stateGroup.CurrentState, true);
93+
}
9394

9495
view.OnSelectionChanged(new SelectionChangedEventArgs(new List<object> { e.OldValue }, new List<object> { e.NewValue }));
9596

9697
// If there is no selection, do not remove the DetailsPresenter content but let it animate out.
9798
if (view.SelectedItem != null)
9899
{
99-
view._detailsPresenter.Content = view.MapDetails == null
100-
? view.SelectedItem
101-
: view.MapDetails(view.SelectedItem);
100+
view.SetDetailsContent();
102101
}
103102

104-
view.SetBackButtonVisibility(view._stateGroup.CurrentState);
103+
if (view._stateGroup != null)
104+
{
105+
view.SetBackButtonVisibility(view._stateGroup.CurrentState);
106+
}
105107
}
106108

107109
/// <summary>
@@ -140,10 +142,8 @@ private void OnLoaded(object sender, RoutedEventArgs e)
140142

141143
_narrowState = GetTemplateChild(NarrowState) as VisualState;
142144

143-
string noSelectionState = _stateGroup.CurrentState == _narrowState
144-
? NoSelectionNarrowState
145-
: NoSelectionWideState;
146-
VisualStateManager.GoToState(this, this.SelectedItem == null ? noSelectionState : HasSelectionState, true);
145+
SetVisualState(_stateGroup.CurrentState, true);
146+
SetBackButtonVisibility(_stateGroup.CurrentState);
147147

148148
UpdateViewState();
149149
}
@@ -174,10 +174,7 @@ private void OnVisualStateChanged(object sender, VisualStateChangedEventArgs e)
174174
SetBackButtonVisibility(e.NewState);
175175

176176
// When adaptive trigger changes state, switch between NoSelectionWide and NoSelectionNarrow.
177-
string noSelectionState = e.NewState == _narrowState
178-
? NoSelectionNarrowState
179-
: NoSelectionWideState;
180-
VisualStateManager.GoToState(this, this.SelectedItem == null ? noSelectionState : HasSelectionState, false);
177+
SetVisualState(e.NewState, false);
181178
}
182179

183180
/// <summary>
@@ -271,5 +268,23 @@ private void UpdateViewState()
271268
ViewStateChanged?.Invoke(this, after);
272269
}
273270
}
271+
272+
private void SetVisualState(VisualState state, bool animate)
273+
{
274+
string noSelectionState = state == _narrowState
275+
? NoSelectionNarrowState
276+
: NoSelectionWideState;
277+
VisualStateManager.GoToState(this, SelectedItem == null ? noSelectionState : HasSelectionState, animate);
278+
}
279+
280+
private void SetDetailsContent()
281+
{
282+
if ((SelectedItem != null) && (_detailsPresenter != null))
283+
{
284+
_detailsPresenter.Content = MapDetails == null
285+
? SelectedItem
286+
: MapDetails(SelectedItem);
287+
}
288+
}
274289
}
275290
}

0 commit comments

Comments
 (0)