【问题标题】:OnPropertyChanged is null in WP8OnPropertyChanged 在 WP8 中为空
【发布时间】:2014-03-24 01:18:57
【问题描述】:

动作命令

我的问题是,对于变量的变化反映在用户界面中,PropertyChanged的值应该不同于null(Left),因为我正在分配一个值。

我有一个通用类来处理按钮的点击事件

 public class ActionCommand : ICommand
{
    Action action;
    public ActionCommand(Action action)
    {
        this.action = action;
    }
    public bool CanExecute(object parameter)
    {
        return true;
    }

    public event EventHandler CanExecuteChanged;

    public void Execute(object parameter)
    {
        action();
    }
}

INotifyPropertyChanged 我有一个类 NotificationEnabledObject 来通知 PropertyChange 中的用户界面的 Left 值更改,它总是返回 null,我不知道我做错了什么??

  public class NotificationEnabledObject : INotifyPropertyChanged
{
 protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

}

视图模型 我有一个具有 Left 属性的 ViewModel 类。

public class WordsViewModel : NotificationEnabledObject
{

    string left;
    public string Left
    {
        get { return left; }
        set
        {
            left = value;
            OnPropertyChanged();
        }

    }

MainPage.xaml

   <phone:PhoneApplicationPage
        x:Class="SpeechRecognition.MainPage"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
        xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:core="http://schemas.microsoft.com/client/2007"
        mc:Ignorable="d"
        FontFamily="{StaticResource PhoneFontFamilyNormal}"
        FontSize="{StaticResource PhoneFontSizeNormal}"
        Foreground="{StaticResource PhoneForegroundBrush}"
        SupportedOrientations="Portrait" Orientation="Portrait"
          xmlns:vm="clr-namespace:SpeechRecognition.ViewModels"
        shell:SystemTray.IsVisible="True"
      DataContext="{Binding Source={StaticResource ViewModel}}">

       <StackPanel>

                       <Grid Height="Auto" Width="Auto">
                            <Grid.RowDefinitions>
                                <RowDefinition/>
                                <RowDefinition/>
                            </Grid.RowDefinitions>

                  <TextBlock Grid.Row="0" FontSize="40" x:Name="txtWord" Height="Auto" VerticalAlignment="Center" HorizontalAlignment="center">
                       <core:Run x:Name="rLeft" Text="{Binding Left, Mode=TwoWay}" />                                    
                        </TextBlock>
                            <Button Name="ReadNow" Grid.Row="1" Height="Auto" Content="Read Now" VerticalAlignment="Bottom" Click="ReadNow_Click">

                            </Button>

                        </Grid>     

            </StackPanel>



    </phone:PhoneApplicationPage>

这个动作是用户界面上按钮的点击事件,不知道怎么弄,OnPropertyChanged一直为null,我想在运行程序的时候反复改变界面Left中变量的值

    ActionCommand getWordsCommand;
    public ActionCommand GetWordsCommand
    {
        get
        {
            if (getWordsCommand == null)
            {
                getWordsCommand = new ActionCommand(() =>
                    {  
                       Left = 10;
                    }
                });
            }

           return getWordsCommand;
          }

}

【问题讨论】:

  • 只是一个建议 - 我会让问题本身更清楚一点,并将其放在顶部。需要花一点时间才能找到您真正要问的内容。
  • @user3453659 请查看下面的答案,如果适合您,请回复或投票并选择它。
  • 感谢您的回答非常有用,...我正在研究解决方案

标签: c# windows-phone-8 null viewmodel icommand


【解决方案1】:

你有几个问题

首先,您的数据上下文需要在您的视图代码中设置

this.Datacontext = //your view model 

第二,你的WordsViewModel类需要实现INotifyPropertyChanged

第三个你的OnPropertyChanged签名是错误的。

它应该看起来像下面的例子

此外,您不应该使用实际的 PropertChanged 事件处理程序。它不是线程安全的。

相反,将其克隆到您的 OnPropertyChanged 事件中

void OnPropertyChanged(String prop){
 PropertyChangedEventHandler handler = PropertyChanged;
 if(handler != null){
   PropertChanged(this,new PropertyChangedEventArgs(prop));
 }

}  

最后在您的Left 属性中调用OnPropertyChanged("Left");

【讨论】:

  • 感谢您的回答非常有用,...我正在研究解决方案
猜你喜欢
  • 1970-01-01
  • 2013-12-05
  • 1970-01-01
  • 2010-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-12
  • 1970-01-01
相关资源
最近更新 更多