Silverlight MVVM - 按钮启用和可见性属性

Sco*_*lvi 6 c# silverlight mvvm

所以我在MVVM应用程序中工作,我开始对功能进行一些亮点和润色.

在我的页面左侧,我显示这些值:

DateActivated
DateCompleted
DateTrialClosed
DateAccountingClosed
Run Code Online (Sandbox Code Playgroud)

如果DB中有日期,我会在文本块中显示它.如果没有,我正在向用户显示一个按钮,说"激活工单","完成工单"等...

我将这8个(4个文本块,4个按钮)控件中的每一个的可见性绑定到我ViewModel的类型中的唯一属性Windows.Visibility.在我的setter中SelectedWorkOrder,我评估SelectedWorkOrder.DateActivated属性的当前值(例如)并相应地设置可见性属性.这对我来说有点冗长,但它按预期工作.

我的下一步是在第一步之后禁用任何可见按钮(逻辑很简单......在单击按钮1之前无法单击按钮2.在单击1和2之前无法单击按钮3).我不确定实现这个的最佳方法是什么.作为一个FYI,我在我的项目中已经有一个boolToVisibility值转换器......我只是不确定实现它与我现在做的有什么不同(参见下面的VM代码).

目前我的XAML有这个:

<TextBlock Text="Proposed:" />
<TextBlock Text="Activated:" />
<TextBlock Text="Eng Completed:" />
<TextBlock Text="Trial Close:" />
<TextBlock Text="Accounting Close:" />
<TextBlock Text="{Binding SelectedWorkOrder.EstimatedStartDate}" Visibility="{Binding ProposedVisibility}" />
<TextBlock Text="{Binding SelectedWorkOrder.DateActivated}" Visibility="{Binding ActivatedTextBlockVisibility}" />
<Button Content="Activate Work Order" Visibility="{Binding ActivatedButtonVisibility}" />
<TextBlock Text="{Binding SelectedWorkOrder.DateCompleted}" Visibility="{Binding EngineeringCompletedTextBlockVisibility}" />
<Button Content="Work Order Eng Complete" Visibility="{Binding EngineeringCompletedButtonVisibility}" />
<TextBlock Text="{Binding SelectedWorkOrder.DateClosed}" Visibility="{Binding TrialCloseTextBlockVisibility}" />
<Button Content="Close Work Order (Trial)" Visibility="{Binding TrialCloseButtonVisibility}" />
<TextBlock Text="{Binding SelectedWorkOrder.DateClosed}" Visibility="{Binding AccountingCloseTextBlockVisibility}" />
<Button Content="Close Work Order (Actual)" Visibility="{Binding AccountingCloseButtonVisibility}" />
Run Code Online (Sandbox Code Playgroud)

VM代码:

if (_SelectedWorkOrder.DateActivated.ToShortDateString() != "1/1/0001")
{
    ActivatedTextBlockVisibility = Visibility.Visible;
    ActivatedButtonVisibility = Visibility.Collapsed;
}
else
{
    ActivatedTextBlockVisibility = Visibility.Collapsed;
    ActivatedButtonVisibility = Visibility.Visible;
}
Run Code Online (Sandbox Code Playgroud)

(1/1/0001在我实例化新的DateTimeif时,日期设置在我的数据库访问层中Is DBNull.Value = true)

zap*_*ico 2

今天晚上我也遇到了类似的问题:-)

我认为执行此类操作的最佳方法是将可见性绑定到 ViewModel 中的属性。

您可以为每个变量使用转换器(这样您就可以在预期时返回 Visibility.Collapsed 或 Visibility.Visible;-))。

您可以对每个按钮使用“CanExecute”方法,以便在按下按钮 1 之前(例如使用布尔变量),按钮 2 无法执行。您必须为此使用命令,以便与每个按钮关联的代码将位于模型视图中。

如果您需要示例,我可以从周一的工作中粘贴它们:-)。

直接在这里编码的一个小例子(我这里没有安装 silverlight)。

你的观点应该是这样的:

<Button Content="Activate Work Order" Command="{Binding ActivateWorkOrderCommand}" />
Run Code Online (Sandbox Code Playgroud)

您可以搜索如何在 MVVM 中使用命令的示例,这里有一个简单的示例

对于转换器,如果您仍然喜欢隐藏和显示按钮,则应该声明一个实现 IValueConverter 的新类:

public class UniversalConverter : IValueConverter {
      public object Convert(object value, Type targetType, 
                         object parameter, CultureInfo culture) {
if(_SelectedWorkOrder.DateActivated.ToShortDateString() != "1/1/0001")
{
          return Visibility.Collapsed;
      }
else { return Visibility.Visible;
}
Run Code Online (Sandbox Code Playgroud)

所以你的视图也应该链接转换器:

<Button Content="Activate Work Order" Visibility="{Binding DateActivated, Converter={StaticResource DateConverter}}" />
Run Code Online (Sandbox Code Playgroud)

希望这对您有帮助;-)