C# 无法在viewmodel的usercontrol中设置属性

C# 无法在viewmodel的usercontrol中设置属性,c#,wpf,user-controls,mvvm-light,dependency-properties,C#,Wpf,User Controls,Mvvm Light,Dependency Properties,我试图从视图模型在usercontrol中设置一个属性,该控件用于捕获和显示用户签名。 我在从视图模型设置usercontrol中的属性时遇到问题。 从usercontrol接收签名到视图模型中效果良好 任何关于如何解决这一问题的想法都将不胜感激 我的测试代码如下 用户控件XAML: <UserControl x:Class="mvvmSignature.ucSignature" xmlns="http://schemas.microsoft.com/winfx

我试图从视图模型在usercontrol中设置一个属性,该控件用于捕获和显示用户签名。 我在从视图模型设置usercontrol中的属性时遇到问题。 从usercontrol接收签名到视图模型中效果良好

任何关于如何解决这一问题的想法都将不胜感激

我的测试代码如下

用户控件XAML:

 <UserControl x:Class="mvvmSignature.ucSignature"
             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" 
             mc:Ignorable="d" 
             d:DesignHeight="212" d:DesignWidth="300" Background="#FFEFFCEF">
    <Grid Height="210">
        <InkCanvas MinHeight="73" HorizontalAlignment="Left" Margin="10,27,0,0" Name="inkCanvas1" VerticalAlignment="Top" MinWidth="278" LostMouseCapture="inkCanvas1_LostMouseCapture" />
        <Button Content="Clear" Height="23" HorizontalAlignment="Left" Margin="33,142,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="buttonClear_Click" />
        <Button Content="Load on user control" Height="23" Margin="143,143,36,45" Click="ButtonLoad_Click" />
    </Grid>
</UserControl>
using System.IO;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Ink;
using System.Windows.Input;
namespace mvvmSignature
{
    public partial class ucSignature : UserControl
    {
        public ucSignature()
        {
            InitializeComponent();
        }
        private void inkCanvas1_LostMouseCapture(object sender, MouseEventArgs e)
        {
            SetSignature();
        }
        private void SetSignature()
        {
            var sb = new StringBuilder();
            using (var ms = new MemoryStream())
            {
                inkCanvas1.Strokes.Save(ms);
                foreach (var item in ms.ToArray())
                {
                    sb.AppendFormat("{0},",
                                        item);
                }
                ms.Close();
            }
            var local = sb.ToString().Trim() + "¬¬¬";
            local = local.Replace(",¬¬¬", string.Empty);
            Signature = local;
        }
        private void LoadSignature(string signatureIn)
        {
            if (string.IsNullOrEmpty(signatureIn) || !signatureIn.Contains(",")) return;
            var x = signatureIn.Split(',').Select(byte.Parse).ToArray();
            if (!x.Any()) return;
            using (var ms = new MemoryStream(x))
            {
                inkCanvas1.Strokes = new StrokeCollection(ms);
                ms.Close();
            }
        }
        public static DependencyProperty SignatureProperty =
        DependencyProperty.Register("Signature", typeof(string),
                                    typeof(ucSignature));
        public string Signature
        {
            get { return (string) GetValue(SignatureProperty); }
            set
            {
                SetValue(SignatureProperty, value);
                LoadSignature(value);
            }
        }
        private void ButtonLoad_Click(object sender, RoutedEventArgs e)
        {
            Signature = "0,136,3,3,6,72,16,69,53,70,53,17,0,0,128,63,31,9,17,0,0,0,0,0,0,240,63,10,237,2,186,1,135,240,12,39,128,97,109,28,4,156,51,90,235,138,135,131,227,95,107,253,119,193,35,104,195,186,246,103,1,195,179,59,78,134,195,179,92,167,188,180,76,206,211,192,77,175,108,211,28,53,136,32,51,41,156,210,3,148,109,22,188,163,105,195,188,11,92,11,184,122,101,188,166,182,124,53,106,153,90,44,217,71,15,64,102,115,59,52,205,105,1,53,128,76,166,179,73,156,202,107,0,195,248,122,106,153,64,22,185,164,210,3,51,154,64,102,51,8,5,174,105,52,128,204,102,19,57,156,215,41,90,69,162,103,1,128,76,128,19,40,4,6,1,102,153,205,96,22,105,156,206,101,53,180,89,230,83,88,4,202,107,0,179,38,120,122,215,52,195,248,120,179,101,25,158,80,195,179,41,156,210,107,50,180,205,38,144,25,156,214,105,52,153,97,249,165,166,101,52,180,205,32,48,0,135,231,164,231,113,153,131,40,225,168,4,6,1,1,128,89,160,22,105,164,214,207,135,32,56,110,3,52,153,192,96,19,80,0,11,68,6,1,105,11,76,2,215,135,50,142,28,77,48,253,160,180,225,232,12,2,107,52,128,205,38,115,91,68,214,105,51,153,77,112,238,30,77,102,80,9,148,214,1,1,154,76,230,64,38,80,8,12,2,101,50,180,205,11,70,29,128,225,236,63,0,153,77,96,19,9,141,154,207,102,153,204,230,19,24,12,209,105,154,64,96,19,89,148,204,0,76,166,118,121,132,204,77,38,179,56,13,170,3,51,128,64,109,24,126,104,154,32,54,121,148,202,103,52,153,77,96,9,144";
        }
        private void buttonClear_Click(object sender, RoutedEventArgs e)
        {
            inkCanvas1.Strokes.Clear();
            SetSignature();
        }
    }
}
<Window xmlns:my="clr-namespace:mvvmSignature"  x:Class="mvvmSignature.MainWindow"
    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"
    xmlns:ignore="http://www.ignore.com"
    mc:Ignorable="d ignore"
    Height="490"
    Width="327"        
    DataContext="{Binding Main, Source={StaticResource Locator}}">   
<StackPanel>
    <my:ucSignature  Signature ="{Binding Signature,Mode=TwoWay}"  />
    <Button Width ="140" Height ="30" Content ="Load On Main Page" Command="{Binding LoadOnMainPageCommand}" />
    <TextBox FontSize="8"
               Foreground="Purple"
               Text="{Binding Signature,Mode=TwoWay}"
               VerticalAlignment="Center"
               HorizontalAlignment="Center"
               TextWrapping="Wrap" Height="210" />
</StackPanel>
using System.Windows.Input;
using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight.Command;
namespace mvvmSignature.ViewModel
{
    public class MainViewModel : ViewModelBase
    {
        public ICommand LoadOnMainPageCommand { get; set; }
        public const string WelcomeTitlePropertyName = "Signature";
        private string _signature = string.Empty;
        public string Signature 
        {
            get
            {
                return _signature;
            }
            set
            {
                if (_signature == value)
                {
                    return;
                }
                _signature = value;
                RaisePropertyChanged(WelcomeTitlePropertyName);
            }
        }

        public MainViewModel()
        {
            LoadOnMainPageCommand = new RelayCommand(LoadSignature);
        }

        private void LoadSignature()
        {
            Signature ="0,136,3,3,6,72,16,69,53,70,53,17,0,0,128,63,31,9,17,0,0,0,0,0,0,240,63,10,237,2,186,1,135,240,12,39,128,97,109,28,4,156,51,90,235,138,135,131,227,95,107,253,119,193,35,104,195,186,246,103,1,195,179,59,78,134,195,179,92,167,188,180,76,206,211,192,77,175,108,211,28,53,136,32,51,41,156,210,3,148,109,22,188,163,105,195,188,11,92,11,184,122,101,188,166,182,124,53,106,153,90,44,217,71,15,64,102,115,59,52,205,105,1,53,128,76,166,179,73,156,202,107,0,195,248,122,106,153,64,22,185,164,210,3,51,154,64,102,51,8,5,174,105,52,128,204,102,19,57,156,215,41,90,69,162,103,1,128,76,128,19,40,4,6,1,102,153,205,96,22,105,156,206,101,53,180,89,230,83,88,4,202,107,0,179,38,120,122,215,52,195,248,120,179,101,25,158,80,195,179,41,156,210,107,50,180,205,38,144,25,156,214,105,52,153,97,249,165,166,101,52,180,205,32,48,0,135,231,164,231,113,153,131,40,225,168,4,6,1,1,128,89,160,22,105,164,214,207,135,32,56,110,3,52,153,192,96,19,80,0,11,68,6,1,105,11,76,2,215,135,50,142,28,77,48,253,160,180,225,232,12,2,107,52,128,205,38,115,91,68,214,105,51,153,77,112,238,30,77,102,80,9,148,214,1,1,154,76,230,64,38,80,8,12,2,101,50,180,205,11,70,29,128,225,236,63,0,153,77,96,19,9,141,154,207,102,153,204,230,19,24,12,209,105,154,64,96,19,89,148,204,0,76,166,118,121,132,204,77,38,179,56,13,170,3,51,128,64,109,24,126,104,154,32,54,121,148,202,103,52,153,77,96,9,144";
        }
    }
}
主窗口XAML:

 <UserControl x:Class="mvvmSignature.ucSignature"
             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" 
             mc:Ignorable="d" 
             d:DesignHeight="212" d:DesignWidth="300" Background="#FFEFFCEF">
    <Grid Height="210">
        <InkCanvas MinHeight="73" HorizontalAlignment="Left" Margin="10,27,0,0" Name="inkCanvas1" VerticalAlignment="Top" MinWidth="278" LostMouseCapture="inkCanvas1_LostMouseCapture" />
        <Button Content="Clear" Height="23" HorizontalAlignment="Left" Margin="33,142,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="buttonClear_Click" />
        <Button Content="Load on user control" Height="23" Margin="143,143,36,45" Click="ButtonLoad_Click" />
    </Grid>
</UserControl>
using System.IO;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Ink;
using System.Windows.Input;
namespace mvvmSignature
{
    public partial class ucSignature : UserControl
    {
        public ucSignature()
        {
            InitializeComponent();
        }
        private void inkCanvas1_LostMouseCapture(object sender, MouseEventArgs e)
        {
            SetSignature();
        }
        private void SetSignature()
        {
            var sb = new StringBuilder();
            using (var ms = new MemoryStream())
            {
                inkCanvas1.Strokes.Save(ms);
                foreach (var item in ms.ToArray())
                {
                    sb.AppendFormat("{0},",
                                        item);
                }
                ms.Close();
            }
            var local = sb.ToString().Trim() + "¬¬¬";
            local = local.Replace(",¬¬¬", string.Empty);
            Signature = local;
        }
        private void LoadSignature(string signatureIn)
        {
            if (string.IsNullOrEmpty(signatureIn) || !signatureIn.Contains(",")) return;
            var x = signatureIn.Split(',').Select(byte.Parse).ToArray();
            if (!x.Any()) return;
            using (var ms = new MemoryStream(x))
            {
                inkCanvas1.Strokes = new StrokeCollection(ms);
                ms.Close();
            }
        }
        public static DependencyProperty SignatureProperty =
        DependencyProperty.Register("Signature", typeof(string),
                                    typeof(ucSignature));
        public string Signature
        {
            get { return (string) GetValue(SignatureProperty); }
            set
            {
                SetValue(SignatureProperty, value);
                LoadSignature(value);
            }
        }
        private void ButtonLoad_Click(object sender, RoutedEventArgs e)
        {
            Signature = "0,136,3,3,6,72,16,69,53,70,53,17,0,0,128,63,31,9,17,0,0,0,0,0,0,240,63,10,237,2,186,1,135,240,12,39,128,97,109,28,4,156,51,90,235,138,135,131,227,95,107,253,119,193,35,104,195,186,246,103,1,195,179,59,78,134,195,179,92,167,188,180,76,206,211,192,77,175,108,211,28,53,136,32,51,41,156,210,3,148,109,22,188,163,105,195,188,11,92,11,184,122,101,188,166,182,124,53,106,153,90,44,217,71,15,64,102,115,59,52,205,105,1,53,128,76,166,179,73,156,202,107,0,195,248,122,106,153,64,22,185,164,210,3,51,154,64,102,51,8,5,174,105,52,128,204,102,19,57,156,215,41,90,69,162,103,1,128,76,128,19,40,4,6,1,102,153,205,96,22,105,156,206,101,53,180,89,230,83,88,4,202,107,0,179,38,120,122,215,52,195,248,120,179,101,25,158,80,195,179,41,156,210,107,50,180,205,38,144,25,156,214,105,52,153,97,249,165,166,101,52,180,205,32,48,0,135,231,164,231,113,153,131,40,225,168,4,6,1,1,128,89,160,22,105,164,214,207,135,32,56,110,3,52,153,192,96,19,80,0,11,68,6,1,105,11,76,2,215,135,50,142,28,77,48,253,160,180,225,232,12,2,107,52,128,205,38,115,91,68,214,105,51,153,77,112,238,30,77,102,80,9,148,214,1,1,154,76,230,64,38,80,8,12,2,101,50,180,205,11,70,29,128,225,236,63,0,153,77,96,19,9,141,154,207,102,153,204,230,19,24,12,209,105,154,64,96,19,89,148,204,0,76,166,118,121,132,204,77,38,179,56,13,170,3,51,128,64,109,24,126,104,154,32,54,121,148,202,103,52,153,77,96,9,144";
        }
        private void buttonClear_Click(object sender, RoutedEventArgs e)
        {
            inkCanvas1.Strokes.Clear();
            SetSignature();
        }
    }
}
<Window xmlns:my="clr-namespace:mvvmSignature"  x:Class="mvvmSignature.MainWindow"
    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"
    xmlns:ignore="http://www.ignore.com"
    mc:Ignorable="d ignore"
    Height="490"
    Width="327"        
    DataContext="{Binding Main, Source={StaticResource Locator}}">   
<StackPanel>
    <my:ucSignature  Signature ="{Binding Signature,Mode=TwoWay}"  />
    <Button Width ="140" Height ="30" Content ="Load On Main Page" Command="{Binding LoadOnMainPageCommand}" />
    <TextBox FontSize="8"
               Foreground="Purple"
               Text="{Binding Signature,Mode=TwoWay}"
               VerticalAlignment="Center"
               HorizontalAlignment="Center"
               TextWrapping="Wrap" Height="210" />
</StackPanel>
using System.Windows.Input;
using GalaSoft.MvvmLight;
using GalaSoft.MvvmLight.Command;
namespace mvvmSignature.ViewModel
{
    public class MainViewModel : ViewModelBase
    {
        public ICommand LoadOnMainPageCommand { get; set; }
        public const string WelcomeTitlePropertyName = "Signature";
        private string _signature = string.Empty;
        public string Signature 
        {
            get
            {
                return _signature;
            }
            set
            {
                if (_signature == value)
                {
                    return;
                }
                _signature = value;
                RaisePropertyChanged(WelcomeTitlePropertyName);
            }
        }

        public MainViewModel()
        {
            LoadOnMainPageCommand = new RelayCommand(LoadSignature);
        }

        private void LoadSignature()
        {
            Signature ="0,136,3,3,6,72,16,69,53,70,53,17,0,0,128,63,31,9,17,0,0,0,0,0,0,240,63,10,237,2,186,1,135,240,12,39,128,97,109,28,4,156,51,90,235,138,135,131,227,95,107,253,119,193,35,104,195,186,246,103,1,195,179,59,78,134,195,179,92,167,188,180,76,206,211,192,77,175,108,211,28,53,136,32,51,41,156,210,3,148,109,22,188,163,105,195,188,11,92,11,184,122,101,188,166,182,124,53,106,153,90,44,217,71,15,64,102,115,59,52,205,105,1,53,128,76,166,179,73,156,202,107,0,195,248,122,106,153,64,22,185,164,210,3,51,154,64,102,51,8,5,174,105,52,128,204,102,19,57,156,215,41,90,69,162,103,1,128,76,128,19,40,4,6,1,102,153,205,96,22,105,156,206,101,53,180,89,230,83,88,4,202,107,0,179,38,120,122,215,52,195,248,120,179,101,25,158,80,195,179,41,156,210,107,50,180,205,38,144,25,156,214,105,52,153,97,249,165,166,101,52,180,205,32,48,0,135,231,164,231,113,153,131,40,225,168,4,6,1,1,128,89,160,22,105,164,214,207,135,32,56,110,3,52,153,192,96,19,80,0,11,68,6,1,105,11,76,2,215,135,50,142,28,77,48,253,160,180,225,232,12,2,107,52,128,205,38,115,91,68,214,105,51,153,77,112,238,30,77,102,80,9,148,214,1,1,154,76,230,64,38,80,8,12,2,101,50,180,205,11,70,29,128,225,236,63,0,153,77,96,19,9,141,154,207,102,153,204,230,19,24,12,209,105,154,64,96,19,89,148,204,0,76,166,118,121,132,204,77,38,179,56,13,170,3,51,128,64,109,24,126,104,154,32,54,121,148,202,103,52,153,77,96,9,144";
        }
    }
}

您需要将MainViewModel设置为MainWindow的
DataContext
,以便绑定工作。除非你在构造函数中设置它,否则我看不到它被设置在任何地方。您可以尝试以下方法:

<Application.Resources>         
<local:MainViewModel x:Key="MainViewModel" />     
</Application.Resources>

DataContext="{StaticResource MainViewModel}" 
<my:ucSignature Signature ="{Binding Signature,Mode=TwoWay}"  />
private string _signature = string.Empty;
public string Signature 
    {
        get { return _signature; }
        set
        {
            if (_signature == value)
                return;

            _signature = value;
            RaisePropertyChanged(Signature);
        }
    }

DataContext=“{StaticResource MainViewModel}”

我将假设您正试图设置的是签名属性,主要是因为这就是您的用户控件的全部内容,这也是我看到问题的地方

设置Signature属性后,对另一个属性调用
RaisePropertyChanged
:WelcomeTitlePropertyName属性。您应该在设置的同一属性上调用
RaisePropertyChanged
,否则您的UI(即您的用户控件)将不知道它

例如,在主窗口XAML中放置了如下ucSignature元素:

<Application.Resources>         
<local:MainViewModel x:Key="MainViewModel" />     
</Application.Resources>

DataContext="{StaticResource MainViewModel}" 
<my:ucSignature Signature ="{Binding Signature,Mode=TwoWay}"  />
private string _signature = string.Empty;
public string Signature 
    {
        get { return _signature; }
        set
        {
            if (_signature == value)
                return;

            _signature = value;
            RaisePropertyChanged(Signature);
        }
    }

我重新编写了ucSignature类的一部分,以便在代码中正确声明和使用Signature属性。改用这个类定义,并告诉我它是否工作得更好

public partial class ucSignature : UserControl
{
    public ucSignature()
    {
        InitializeComponent();
    }

    private void inkCanvas1_LostMouseCapture(object sender, MouseEventArgs e)
    {
        var sb = new StringBuilder();
        using (var ms = new MemoryStream())
        {
            inkCanvas1.Strokes.Save(ms);
            foreach (var item in ms.ToArray())
            {
                sb.AppendFormat("{0},", item);
            }
            ms.Close();
        }
        var local = sb.ToString().Trim() + "¬¬¬";
        local = local.Replace(",¬¬¬", string.Empty);

        this.SetValue(SignatureProperty, local);
    }

    private void LoadSignature(string signatureIn)
    {
        if (string.IsNullOrEmpty(signatureIn) || !signatureIn.Contains(",")) return;
        var x = signatureIn.Split(',').Select(byte.Parse).ToArray();
        if (!x.Any()) return;
        using (var ms = new MemoryStream(x))
        {
            inkCanvas1.Strokes = new StrokeCollection(ms);
            ms.Close();
        }
    }

    public static DependencyProperty SignatureProperty = DependencyProperty.Register(
        "Signature",
        typeof(string),
        typeof(ucSignature),
        new UIPropertyMetadata(OnSignaturePropertyChanged));

    public static string GetSignature(ucSignature signature)
    {
        return (string)signature.GetValue(SignatureProperty);
    }

    public static void SetSignature(ucSignature signature, string value)
    {
        signature.SetValue(SignatureProperty, value);
    }

    private static void OnSignaturePropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
    {
        var signature = obj as ucSignature;

        if (signature != null)
        {
            LoadSignature(args.NewValue.ToString());
        }
    }

    private void ButtonLoad_Click(object sender, RoutedEventArgs e)
    {
        this.SetValue(SignatureProperty, "0,136,3,3,6,72,16,69,53,70,53,17,0,0,128,63,31,9,17,0,0,0,0,0,0,240,63,10,237,2,186,1,135,240,12,39,128,97,109,28,4,156,51,90,235,138,135,131,227,95,107,253,119,193,35,104,195,186,246,103,1,195,179,59,78,134,195,179,92,167,188,180,76,206,211,192,77,175,108,211,28,53,136,32,51,41,156,210,3,148,109,22,188,163,105,195,188,11,92,11,184,122,101,188,166,182,124,53,106,153,90,44,217,71,15,64,102,115,59,52,205,105,1,53,128,76,166,179,73,156,202,107,0,195,248,122,106,153,64,22,185,164,210,3,51,154,64,102,51,8,5,174,105,52,128,204,102,19,57,156,215,41,90,69,162,103,1,128,76,128,19,40,4,6,1,102,153,205,96,22,105,156,206,101,53,180,89,230,83,88,4,202,107,0,179,38,120,122,215,52,195,248,120,179,101,25,158,80,195,179,41,156,210,107,50,180,205,38,144,25,156,214,105,52,153,97,249,165,166,101,52,180,205,32,48,0,135,231,164,231,113,153,131,40,225,168,4,6,1,1,128,89,160,22,105,164,214,207,135,32,56,110,3,52,153,192,96,19,80,0,11,68,6,1,105,11,76,2,215,135,50,142,28,77,48,253,160,180,225,232,12,2,107,52,128,205,38,115,91,68,214,105,51,153,77,112,238,30,77,102,80,9,148,214,1,1,154,76,230,64,38,80,8,12,2,101,50,180,205,11,70,29,128,225,236,63,0,153,77,96,19,9,141,154,207,102,153,204,230,19,24,12,209,105,154,64,96,19,89,148,204,0,76,166,118,121,132,204,77,38,179,56,13,170,3,51,128,64,109,24,126,104,154,32,54,121,148,202,103,52,153,77,96,9,144");
    }
    private void buttonClear_Click(object sender, RoutedEventArgs e)
    {
        inkCanvas1.Strokes.Clear();
        this.SetValue(SignatureProperty, string.Empty);
    }
}

你想设置哪个属性?他确实设置了数据上下文
DataContext=“{Binding Main,Source={StaticResource Locator}}}”>
@bugged87好的,“Main”和“Locator”在哪里“在装订里?这些特定于MVVM Light吗?是的,MVVM Light toolkit将ViewModelLocator类添加到新的WPF项目中。此类包含每个视图模型的静态属性,以及用于绑定的非静态属性。因此,默认情况下,MainViewModel将在ViewModelLocator中声明一个称为“MainStatic”的静态属性和一个称为“Main”的非静态属性。通过在应用程序资源中添加以下内容,可以在XAML中引用定位器:
@bugged87感谢您的澄清,现在更清晰了。一开始我没有注意到MVVM Light标记,所以是我的错。我认为这里没有问题,因为该属性是静态的,它的值为“Signature”,与属性名称相同。然而,这是一种奇怪的方式。你完全正确。我没有注意,因为我使用了一个单独的方法来调用RaisePropertyChanged,它将实际属性作为如下表达式:
NotifySetProperty(ref _签名,value,()=>signature)这就是我的setter中的全部内容。NotifySetProperty方法负责检查null和相等性以及引发PropertyChanged事件。我不得不修改以下OnSignaturePropertyChanged以适应非静态InkCanvas控件私有静态无效OnSignaturePropertyChanged(DependencyObject obj,DependencyPropertyChangedEventArgs args){var signature=obj作为ucSignature;if(signature!=null)signature.LoadSignature(args.NewValue.ToString());}