我正在把剩下的头发拉出来试图在Silverlight中运行一些在WPF中开箱即用的东西。
我在表单上有一些表示项目的CheckBox - Checked属性绑定到我的ViewModel中的bool(每个项目一个viewmodel)。选中该复选框后,它会将该项添加到另一个ViewModel中的列表中 - 在此之前我想执行一些验证(在我的情况下,计算其他ViewModel列表中有多少项,如果达到限制则显示用户一条消息)如果此验证失败,请不要将其添加到列表中并取消选中该框。当它运行时,在bool属性设置器中完成验证检查后,我可以看到值设置回false,但这不会反映在Silverlight UI中的CheckBox中,因此CheckBox保持选中状态。在WPF中,这个问题不会发生。
以下代码演示了这个问题 - 为了简洁起见而不是执行验证,我只是在检查时强制取消选中该框。
XAML
<UserControl x:Class="CheckboxTest.SL.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="400">
<Grid x:Name="LayoutRoot" Background="White">
<CheckBox IsChecked="{Binding IsSelected, Mode=TwoWay}" Margin="20"/>
</Grid>
</UserControl>
背后的代码
namespace CheckboxTest.SL
{
public partial class MainPage : UserControl
{
public MainPage()
{
InitializeComponent();
this.DataContext = new MainPageViewModel();
}
}
public class MainPageViewModel : INotifyPropertyChanged
{
private bool _isSelected;
public bool IsSelected
{
get { return _isSelected; }
set
{
_isSelected = value;
if (_isSelected) //if checked always uncheck
_isSelected = false; //this does not get reflected in UI in Silverlight
OnPropertyChanged("IsSelected");
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler changedEventHandler = this.PropertyChanged;
if (changedEventHandler == null)
return;
changedEventHandler((object)this, new PropertyChangedEventArgs(propertyName));
}
}
}
我知道人们曾经在WPF pre .NET 4.0中通过将属性绑定设置为Async(Silverlight中不允许)或实现虚拟IValueConverter来解决此问题(试过这个并且没有效果)在Silverlight)。
有人可以建议一种方法让Silverlight中的上述工作吗?
答案 0 :(得分:1)
执行此操作的一种方法是将CheckBox的IsEnabled
属性绑定到ViewModel中的布尔属性,您可以在其中执行验证。
public bool CanEditCheckBox
{
get
{
// perform validation here
return list.Length < 100;
}
}
修改强>
我测试了你的代码,它看起来像预期的那样。