PropertyChangedEventHandler不起作用

时间:2014-11-11 17:42:57

标签: c# wpf

我的UserControl xaml中有以下标签和滑块

<Label x:Name="labelValX" Content="{Binding Path=xValue}" HorizontalAlignment="Left" Width="88" Height="44"/>

 <Slider x:Name="sliderSpeed" Value="{Binding slideValue, Mode=TwoWay}" HorizontalAlignment="Left" Margin="10,35,0,0" VerticalAlignment="Top" Width="173" Height="53" Minimum="10" Maximum="100" />

和特定的SetGetAccValues.cs类:

public class SetGetAccValues : UserControl, INotifyPropertyChanged
{

    public event PropertyChangedEventHandler PropertyChanged;


    private string _xval;
    public string xValue
    {
        get { return _xval; }
        set
        {
            if (value != _xval)
            {
                _xval = value;
                OnPropertyChanged("xValue");
            }
        }
    }

    public byte _slideValue;  
    public byte slideValue {
            get
            {
                return _slideValue;
            }
            set
            {
                if (value != _slideValue)
                {
                    _slideValue = value;
                    OnPropertyChanged("slideValue");
                }
            }
          }


   protected virtual void OnPropertyChanged(string propName)
   {
      if (PropertyChanged != null)
       {
           PropertyChanged(this, new PropertyChangedEventArgs(propName));
           if (propName.Equals("slideValue"))
           {
           speedAccMeter(slideValue); 
           }
       }
   }

在我的其他GetAccNotifications.cs课程中,我有以下部分,我将xValue字符串定义为特定值:

Y = ((double)(sbyte)value) / 64.0;
Y = Math.Round(Y, 2);
SetGetAccValues set = new SetGetAccValues();
set.xValue = Y.ToString();

使用&#34; xValue&#34;触发OnPropertyChanged时会出现问题作为propName,PropertyChangedEventHandler始终为null,但是当使用&#34; slideValue&#34;作为propName,它实际上不是null。为什么在xValue情况下它仍然为空?

2 个答案:

答案 0 :(得分:1)

我认为你没有绑定DataContext。在你的情况下,你应该在后面设置DataContext代码。

在SetGetAccValues.xaml.cs

    public SetGetAccValues()
    {       
        DataContext = this;
    }

答案 1 :(得分:1)

我相信PropertyChanged事件是在datacontext加载完成之前触发的。

您可以在usercontrol中侦听DataContextChanged事件,以便在新的datacontext可用时,您可以设置属性。

public AccView()
{
    InitializeComponent();

    this.DataContextChanged += OnDataContextChanged;

    this.DataContext = new SetGetAccValues();    
}

private void OnDataContextChanged(object sender, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs)
{
    Y = ((double)(sbyte)value) / 64.0;
    Y = Math.Round(Y, 2);

    (dependencyPropertyChangedEventArgs.NewValue as SetGetAccValues).xValue = Y.ToString();
}