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)
今天晚上我也遇到了类似的问题:-)
我认为执行此类操作的最佳方法是将可见性绑定到 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)
希望这对您有帮助;-)
| 归档时间: |
|
| 查看次数: |
7348 次 |
| 最近记录: |