Silverlight复选框绑定 - 在视图模型属性

时间:2015-07-08 09:23:14

标签: c# xaml silverlight checkbox silverlight-5.0

我正在把剩下的头发拉出来试图在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中的上述工作吗?

1 个答案:

答案 0 :(得分:1)

执行此操作的一种方法是将CheckBox的IsEnabled属性绑定到ViewModel中的布尔属性,您可以在其中执行验证。

public bool CanEditCheckBox
{
    get
    {
        // perform validation here
        return list.Length < 100;
    }
}

修改

我测试了你的代码,它看起来像预期的那样。