PropertyChanged和IValueConverter

时间:2018-09-27 18:56:16

标签: c# wpf valueconverter propertychanged

我需要在TextBlock中单击UserControl时,可视性根据IsChecked的值而更改

我想选择我的复选框,但遇到了这样的问题。 System.NullReferenceException:“对象引用未指向该对象的实例。”在OnPropertyChanged方法中。 此控件的逻辑是,当您单击“可见性”时,TextBlock应该变为“隐藏”或“可见”(取决于IsChecked值)。 如果我不写OnPropertyChanged(“ IsChecked”);然后点击不会崩溃,但是什么也没有发生。

UserCheckBox.xaml.cs

public partial class UserCheckBox : UserControl
{
    public UserCheckBox()
    {
        InitializeComponent();
        DataContext = this;
        MouseUp += delegate (object sender, MouseButtonEventArgs e)
        {
            this.IsChecked = true;
        };
    }

    private bool _IsChecked = false;
    public bool IsChecked
    {
        get { return _IsChecked; } private set { _IsChecked = value; OnPropertyChanged("IsChecked"); }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string name)
    {
        PropertyChanged(this, new PropertyChangedEventArgs(name));
    }
}

UserCheckBox.xaml

<UserControl x:Class="COP.UserCheckBox"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         xmlns:local="clr-namespace:COP"
         mc:Ignorable="d" 
         d:DesignHeight="30" d:DesignWidth="30" Background="#707070" Name="mainCheckBox">
<UserControl.Resources>
    <local:VisibilityConvert x:Key="Convert"></local:VisibilityConvert>
</UserControl.Resources>
<Border BorderThickness="2" BorderBrush="Black">
    <Grid>        
    <TextBlock FontFamily="Segoe UI Symbol" Text="&#xE10B;" Visibility="{Binding ElementName=mainCheckBox, Path=IsChecked, Converter={StaticResource Convert}}"></TextBlock>
</Grid>
</Border>

VisibilityConvert.cs

class VisibilityConvert : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return (bool)value == true ? Visibility.Visible : Visibility.Hidden;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

1 个答案:

答案 0 :(得分:0)

您的UserControl必须使用INotifyPropertyChanged界面,否则WPF不知道听此类。

执行以下操作:

public partial class UserCheckBox : UserControl, INotifyPropertyChanged

此外,您的IsChecked设置程序在应公开时是私有的,否则您将无法设置该属性。

要注意的另一件事是,不能在此属性上使用Binding,因为它不是Dependency属性,因此只能像在IsChecked="True"中那样在XAML中进行设置。您可能想创建一个依赖项属性,请阅读this article

编辑:

由于我在测试代码OP时遇到了IsChecked =“ True”,因此我忘记了您还需要订阅鼠标左键单击事件,请在UserControl XAML上执行此操作:

MouseLeftButtonDown="OnMouseLeftButtonDown" Background="Transparent"

然后在UserControl.xaml.cs中创建方法:

private void OnMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    IsChecked = !IsChecked;
}

透明背景的原因是要在UserControl的整个区域启用点击事件。

所有这些,我强烈建议您放弃整个事情。与学习如何设计现有Checkbox控件的样式相比,而不是创建自己的复选框要好得多。