[英]Cant update screen (textbox) on button click event for simple calculator application
Iam是C#Windows Phone開發的新手,Iam嘗試使用mvvm設計模式構建一個簡單的計算器應用程序。 我有一個帶有一個字符串變量的模型類。 這綁定到我的計算器屏幕上,這是一個文本框。 我也有一個數字“ 1”按鈕。 當按下此按鈕時,我希望文本框“屏幕”更新該值。 這是在實現ICommand接口的命令類中完成的。 不幸的是,這目前無法正常工作,我無法弄清楚問題出在哪里。 下面是我的模型課。 它非常基本。
namespace PhoneApp2.model
{
public class Sum : INotifyPropertyChanged
{
private string _enteredVal;
public string EnteredVal
{
get { return _enteredVal ; }
set
{
_enteredVal = value;
RaisePropertyChanged("EnteredVal");
}
}
public event PropertyChangedEventHandler PropertyChanged;
public void RaisePropertyChanged(string propName)
{
if (this.PropertyChanged != null)
{
this.PropertyChanged(this, new PropertyChangedEventArgs(propName));
}
}
}
接下來是主頁的xaml文件。 目前我沒有。 1個鏈接到命令類execute()方法的按鈕。 並且我的屏幕文本框綁定了我的Enteredvalue字符串。 顯然,這似乎不是理想的方法,但iam是以這種方式學習的,因為我是在iam做實習的地方開發某些應用程序的。
<Grid x:Name="LayoutRoot" Background="Transparent">
<Grid.Resources>
<commands:UpdateScreenCommand x:Key="myCommand"/>
</Grid.Resources>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
<TextBlock Text="Calculator" Style="{StaticResource PhoneTextNormalStyle}" Margin="12,0"/>
</StackPanel>
<!--ContentPanel - place additional content here-->
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="0,143,0,0" >
<Grid.RowDefinitions>
<RowDefinition Height="1*"/>
<RowDefinition Height="1*"/>
<RowDefinition Height="1*"/>
<RowDefinition Height="1*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1*"/>
<ColumnDefinition Width="1*"/>
<ColumnDefinition Width="1*"/>
<ColumnDefinition Width="1*"/>
</Grid.ColumnDefinitions>
<Button Content="1" Command="{StaticResource myCommand}" CommandParameter="{Binding}" Height="Auto" Width="Auto" Grid.Row="0" Grid.Column="0"/>
<Button Content="2" Height="Auto" Width="Auto" Grid.Row="0" Grid.Column="1"/>
<Button Content="3" Height="Auto" Width="Auto" Grid.Row="0" Grid.Column="2"/>
<Button Content="+" Height="Auto" Width="Auto" Grid.Row="0" Grid.Column="3"/>
<Button Content="4" Height="Auto" Width="Auto" Grid.Row="1" Grid.Column="0"/>
<Button Content="5" Height="Auto" Width="Auto" Grid.Row="1" Grid.Column="1"/>
<Button Content="6" Height="Auto" Width="Auto" Grid.Row="1" Grid.Column="2"/>
<Button Content="-" Height="Auto" Width="Auto" Grid.Row="1" Grid.Column="3"/>
<Button Content="7" Height="Auto" Width="Auto" Grid.Row="2" Grid.Column="0"/>
<Button Content="8" Height="Auto" Width="Auto" Grid.Row="2" Grid.Column="1"/>
<Button Content="9" Height="Auto" Width="Auto" Grid.Row="2" Grid.Column="2"/>
<Button Content="/" Height="Auto" Width="Auto" Grid.Row="2" Grid.Column="3"/>
<Button Content="0" Height="Auto" Width="Auto" Grid.Row="3" Grid.Column="1"/>
<Button Content="*" Height="Auto" Width="Auto" Grid.Row="3" Grid.Column="3"/>
<Button Content="C" Height="Auto" Width="Auto" Grid.Row="3" Grid.Column="0"/>
<Button Content="=" Height="Auto" Width="Auto" Grid.Row="3" Grid.Column="2"/>
</Grid>
<Grid MinHeight="107" Margin="10,10,0,0" Grid.Row="1" VerticalAlignment="Top" Width="458" RenderTransformOrigin="0.467,-0.089">
<TextBox Height="Auto" Text="{Binding EnteredValue, Mode=OneWay}" TextWrapping="Wrap" VerticalAlignment="Center" Width="Auto" />
</Grid>
</Grid>
最后是命令類 execute方法附加_enteredvalue字符串。 這似乎在調試時起作用。 我的問題似乎是因為將屬性傳遞給null的raisepropertychanged方法。 但我不確定如何解決此問題。
namespace PhoneApp2.commands
{
public class UpdateScreenCommand : ICommand
{
public bool CanExecute(object parameter)
{
var m = (Sum) parameter;
return true;
}
public event EventHandler CanExecuteChanged;
public void Execute(object parameter)
{
var m = (Sum) parameter;
m.EnteredVal += "1";
}
}
}
我再次知道這是mvvm的混蛋,但是iam試圖了解它在我工作的地方是如何實現的。 任何幫助是極大的贊賞。
從您當前的MVVM實現中最令我困擾的是Command。 基本上,我們只需要創建一個實現ICommand的類即可。 然后,我們可以從該類創建多個屬性,每個屬性都可以執行不同的方法/代碼。 來自另一個SO帖子的ICommand的示例實現:
public class ActionCommand : ICommand
{
private readonly Action _action;
public ActionCommand(Action action)
{
_action = action;
}
public void Execute(object parameter)
{
_action();
}
public bool CanExecute(object parameter)
{
return true;
}
public event EventHandler CanExecuteChanged;
}
然后我們通常將上面提到的命令屬性放在ViewModel中:
public class Sum : INotifyPropertyChanged
{
private ICommand _addOneCommand;
public ICommand AddOneCommand
{
get
{
return _addOneCommand
?? (_addOneCommand = new ActionCommand(() =>
{
EnteredVal += "1";
}));
}
}
.....
.....
}
假設頁面的DataContext的已正確設置為Sum
,我們可以綁定的按鈕,即可命令屬性Sum
,如下所示:
<Button Content="1" Command="{AddOneCommand}" Height="Auto" Width="Auto" Grid.Row="0" Grid.Column="0"/>
有關Windows Phone應用程序中MVVM入門的一些教程:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.