在查看和编辑模式之间切换 ListDetailsView 中的 DetailsTemplate

Switch DetailsTemplate in ListDetailsView between view and edit mode

我确实有一个 ListDetailsView 显示一些数据(假设 Company 在这里作为一个简单的例子)。通常 Company 的详细信息显示为 readonly。但是,通过 ListDetailsView.DetailsCommandBar 可以编辑 Company(也可以添加新的 Company)。 viewedit 模式之间的明确区分似乎是 UI 的不错选择。我正在使用 UserControl 来显示 Company.

的详细信息

所以这是我的问题:

  1. view- 和edit- 模式应该在哪里区分?我认为在两者之间设置 CompanyDetailsControlCompanyDetailsEditControl 以及 select 是个好主意(两者都使用相同的 CompanyDetailsViewModel)。还有其他解决方案,例如,CompanyDetailsControl 可以在内部处理 edit- 和 view- 模式。
  2. 假设在两个 UserControl 之间切换是个好主意,如何用 ListDetailsView.DetailsTemplate 实现?我虽然在这里使用 DataTemplateSelector 很容易,但这只适用于 ItemTemplate.

不确定要提供什么代码来澄清我的问题。因此,如果您需要任何代码来更好地理解我的问题,请发表评论。

注意:我从未使用过 UWP 应用程序,只应用了 WPF 中的 MVVM 模式。


没有绘制应发生分割的直线。往往取决于开发者自己,使用什么框架等等。

我个人会选择 UI handles UIs' thingsViewModel handles data only 的方式。这意味着视图负责向您显示您期望 see/control 应用程序的控件。当视图得知 property was changed 时,它应该更新它的外观。

既然我们知道应用程序将具有 editreadonly 模式,我们应该准备所有必要的 UI 组件(UserControlsPages , ...) 来处理这两种状态。它们将绑定到 ViewModel,其在 BaseViewModel 中具有基础,其中已经包含此编辑变量。这样每个 UI 组件都知道它可以使用它。

基本视图模型:

abstract class BaseViewModel : INotifyPropertyChanged
{
    private string mIsInEditMode;
    public string IsInEditMode
    {
        get { return mIsInEditMode; }
        set
        {
            if(mIsInEditMode == value) return;

            mIsInEditMode = value;
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(IsInEditMode));
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;
}

所有“普通”ViewModel 都继承自它:

class CompanyViewModel : BaseViewModel
{ /* props and logic of company */ }

UI 组件 (UserControl) 将具有触发器 (<Style.Triggers/>) 或绑定属性 VisibilityIsEnabledBaseViewModel .这些绑定将处理 showing/hiding 的这种逻辑,并且您有可能控制整个布局、隐藏控件等

<UserControl d:DataContext="{x:Bind local:CompanyViewModel}">
  <UserControl.Resources>
      <local:BoolInverterConverter x:Key="BoolInvert"/>
  </UserControl.Resources>

  <Grid>

     <Grid IsVisible="{Binding IsInEditMode}" IsEnabled="{Binding IsInEditMode}">
       <!-- Controls for edit mode -->
     </Grid>

     <Grid IsVisible="{Binding IsInEditMode, Converter={StaticResource BoolInvert}}"
           IsEnabled="{Binding IsInEditMode, Converter={StaticResource BoolInvert}}">
       <!-- Controls for readonly mode -->
     </Grid>

  </Grid>
</UserControl>

注意:我使用了 属性 IsVisible,您实际上会使用 Visibility 和一些自定义转换器。