2016-06-16 12 views
-3

プリズム6を使用してWPFでアプリケーションを開発しました。このコマンドで日付時刻を更新しようとしました。私は成功を収めずにコードを更新しようとしています。WPF MVVMコマンドが動作しません

EDIT 1:旧リンクから 追加されたコードは

クラスをOnedriveします

public class Employee : BindableBase 
{ 
    private int _id; 
    public int ID 
    { 
     get { return _id; } 

     set 
     { 
      SetProperty(ref _id, value); 
     } 
    } 

    private string _firstName ="YehudaEmp"; 

    public string FirstName 
    { 
     get { return _firstName; } 
     set {SetProperty(ref _firstName , value); } 
    } 

    private string _lastName="DnaiEmp"; 
    public string LastName 
    { 
     get { return _lastName; } 
     set 
     { 
      SetProperty(ref _lastName, value); 
     } 
    } 

    private int _phone; 
    public int Phone 
    { 
     get 
     { 
      return _phone; 
     } 

     set 
     { 
      SetProperty(ref _phone, value); 
     } 
    } 

    private string _email; 
    public string Email 
    { 
     get { return _email; } 
     set 
     { 
      SetProperty(ref _email, value); 
     } 
    } 

    private string _city; 
    public string City 
    { 
     get { return _city; } 
     set 
     { 
      SetProperty(ref _city, value); 
     } 
    } 

    private string _street; 
    public string Street 
    { 
     get { return _street; } 
     set 
     { 
      SetProperty(ref _street, value); 
     } 
    } 


    private string _state; 
    public string State 
    { 
     get { return _state; } 
     set 
     { 
      SetProperty(ref _state, value); 
     } 
    } 

    private DateTime? _lastUpdate; 
    public DateTime? LastUpdate 
    { 
     get { return _lastUpdate; } 
     set 
     { 
      SetProperty(ref _lastUpdate, value); 
     } 
    }  
} 

public class EmployeeViewModel :BindableBase 
{ 

    private Employee emop; 


    public string FirstName 
    { 
     get { return emop.FirstName; } 
     set 
     { 
      emop.FirstName = value; 
     } 

    } 

    public string LastName 
    { 
     get { return emop.LastName; } 
     set 
     { 
      emop.LastName = value; 
     } 
    } 

    public DateTime? lastUpdated 
    { 
     get { return emop.LastUpdate; } 
     set 
     { 
      emop.LastUpdate = value; 
     } 
    } 

    public DelegateCommand updateCommand { get; set; } 


    public EmployeeViewModel() 
    { 

     emop = new Employee(); 
     updateCommand = new DelegateCommand(Execute , canExecute).ObservesProperty(()=>FirstName).ObservesProperty(() =>LastName); 
    } 

    private bool canExecute() 
    { 
     return !String.IsNullOrWhiteSpace(FirstName) && !String.IsNullOrWhiteSpace(LastName); 
    } 

    private void Execute() 
    { 

     lastUpdated = DateTime.Now; 

    } 
} 

XAML:

<Grid> 
    <StackPanel> 
     <Grid > 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="200"/> 
       <ColumnDefinition Width="*"/> 
       <ColumnDefinition Width="2*"/> 

      </Grid.ColumnDefinitions> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="Auto"/> 
       <RowDefinition/> 
       <RowDefinition/> 
       <RowDefinition/> 
      </Grid.RowDefinitions> 
      <TextBox Grid.Column="0" Grid.Row="0" Width="195" Height="30" Margin="5" Text="{Binding FirstName ,UpdateSourceTrigger=PropertyChanged}"/> 
      <TextBox Grid.Column="0" Grid.Row="1" Width="195" Height="30" Margin="5" Text="{Binding LastName , UpdateSourceTrigger=PropertyChanged}"/> 
      <TextBlock Text="{Binding lastUpdated,UpdateSourceTrigger=PropertyChanged}" Grid.Row="2" Grid.Column="1" FontSize="20"/> 
      <Button Name="updatebtn" Grid.Row="3" Grid.Column="1" Width="Auto" Height="30" Margin="5" Content="update" Command="{Binding updateCommand,Mode=TwoWay}"/> 
     </Grid> 
    </StackPanel> 
</Grid> 

任意のヘルプ?

+2

質問に直接コードを入力してください –

+0

なぜ「Employee.Name」にバインドしないのですか?これは私の意見では正しい方法でしょう。 –

+0

'Command'は' Mode'を 'TwoWay'に設定できますか?私はそれがバインディングエラーを生成することを期待していますが、私は試みたことがないので、私は確かに分かりません。そのフォームが読み込まれたときに出力ウィンドウを確認し、バインディングエラーが表示されないことを確認します。結束が完全に失敗する可能性があります。 –

答えて

1

ビューモデルがビューにバインドされているEmployeeViewModelであると仮定します。

あなたの問題は、ビューモデルが表示されていないということです。ビューにはPropertyChangedというイベントがあります。モデルからEmployeeというプロパティ変更イベントが発生していますが、ビューによってキャプチャされていません。

ビューをキャプチャするには、ビューモデルからイベントを発生させる必要があります。

方法BindableBase.SetProperty<T>PropertyChangedイベントを発生させますので、あなたが必要とするすべてはEmployeeViewModelクラスにEmployeeクラスからSetProperty<T>にあなたの呼び出しを移動することです。

だから、例えば、あなたのlastUpdatedはバインディング:

<TextBlock Text="{Binding lastUpdated,UpdateSourceTrigger=PropertyChanged}" Grid.Row="2" Grid.Column="1" FontSize="20"/> 

は、次のようになりますビューモデルで対応するプロパティれている必要があります。MVVMの観点から

private DateTime? m_lastUpdated; 

public DateTime? lastUpdated 
{ 
    get { return m_lastUpdated; } 
    set { SetProperty<DateTime?>(ref m_lastUpdated, value); 
} 

を、あなたは通常、ドン」モデルからPropertyChangedイベントを呼び出すと(あなたのケースではEmployee)、ビューと通信する必要のあるエンティティはビューモデル(ケースではEmployeeViewModel)です。

+0

10倍を削除しようとしています – Zcode

関連する問題