在查看和编辑模式之间切换 ListDetailsView 中的 DetailsTemplate
Switch DetailsTemplate in ListDetailsView between view and edit mode
我确实有一个 ListDetailsView
显示一些数据(假设 Company
在这里作为一个简单的例子)。通常 Company
的详细信息显示为 readonly。但是,通过 ListDetailsView.DetailsCommandBar
可以编辑 Company
(也可以添加新的 Company
)。 view 和 edit 模式之间的明确区分似乎是 UI 的不错选择。我正在使用 UserControl
来显示 Company
.
的详细信息
所以这是我的问题:
- view- 和edit- 模式应该在哪里区分?我认为在两者之间设置
CompanyDetailsControl
和 CompanyDetailsEditControl
以及 select 是个好主意(两者都使用相同的 CompanyDetailsViewModel
)。还有其他解决方案,例如,CompanyDetailsControl
可以在内部处理 edit- 和 view- 模式。
- 假设在两个
UserControl
之间切换是个好主意,如何用 ListDetailsView.DetailsTemplate
实现?我虽然在这里使用 DataTemplateSelector
很容易,但这只适用于 ItemTemplate
.
不确定要提供什么代码来澄清我的问题。因此,如果您需要任何代码来更好地理解我的问题,请发表评论。
注意:我从未使用过 UWP 应用程序,只应用了 WPF 中的 MVVM 模式。
没有绘制应发生分割的直线。往往取决于开发者自己,使用什么框架等等。
我个人会选择 UI handles UIs' things
和 ViewModel handles data only
的方式。这意味着视图负责向您显示您期望 see/control 应用程序的控件。当视图得知 property was changed
时,它应该更新它的外观。
既然我们知道应用程序将具有 edit
和 readonly
模式,我们应该准备所有必要的 UI 组件(UserControls
、Pages
, ...) 来处理这两种状态。它们将绑定到 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/>
) 或绑定属性 Visibility
和 IsEnabled
到 BaseViewModel
.这些绑定将处理 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
和一些自定义转换器。
我确实有一个 ListDetailsView
显示一些数据(假设 Company
在这里作为一个简单的例子)。通常 Company
的详细信息显示为 readonly。但是,通过 ListDetailsView.DetailsCommandBar
可以编辑 Company
(也可以添加新的 Company
)。 view 和 edit 模式之间的明确区分似乎是 UI 的不错选择。我正在使用 UserControl
来显示 Company
.
所以这是我的问题:
- view- 和edit- 模式应该在哪里区分?我认为在两者之间设置
CompanyDetailsControl
和CompanyDetailsEditControl
以及 select 是个好主意(两者都使用相同的CompanyDetailsViewModel
)。还有其他解决方案,例如,CompanyDetailsControl
可以在内部处理 edit- 和 view- 模式。 - 假设在两个
UserControl
之间切换是个好主意,如何用ListDetailsView.DetailsTemplate
实现?我虽然在这里使用DataTemplateSelector
很容易,但这只适用于ItemTemplate
.
不确定要提供什么代码来澄清我的问题。因此,如果您需要任何代码来更好地理解我的问题,请发表评论。
注意:我从未使用过 UWP 应用程序,只应用了 WPF 中的 MVVM 模式。
没有绘制应发生分割的直线。往往取决于开发者自己,使用什么框架等等。
我个人会选择 UI handles UIs' things
和 ViewModel handles data only
的方式。这意味着视图负责向您显示您期望 see/control 应用程序的控件。当视图得知 property was changed
时,它应该更新它的外观。
既然我们知道应用程序将具有 edit
和 readonly
模式,我们应该准备所有必要的 UI 组件(UserControls
、Pages
, ...) 来处理这两种状态。它们将绑定到 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/>
) 或绑定属性 Visibility
和 IsEnabled
到 BaseViewModel
.这些绑定将处理 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
和一些自定义转换器。