2016-11-12 9 views
0

私のアプリケーションにmvvmを実装しようとしています。私は、コマンドへのバインディングを持っている、と私はイベントを発生する必要がある場合、コマンド 私のviewmodelWPFファイアプロパティmvvmでuiを更新すると変更される

public class AddEditWindowViewModel: INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 
    ...... 
    public ConfirmCommand ConfirmCommand { get; set; } 
    public string Path{ get; set; } 

    public AddEditWindowViewModel() 
    { 
     WindowTitle = "Add new item"; 
     ConfirmCommand = new ConfirmCommand(this); 
    } 

    [NotifyPropertyChangedInvocator] 
    protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null) 
    { 
     PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

マイコマンド

public class ConfirmCommand: ICommand 
{ 
    private AddEditWindowViewModel _model; 

    public ConfirmCommand(AddEditWindowViewModel model) 
    { 
     _model = model; 
     _model.PropertyChanged += ModelOnPropertyChanged; 
    } 

    private void ModelOnPropertyChanged(object sender, PropertyChangedEventArgs args) 
    { 
     if (args.PropertyName.Equals("Path")) 
     { 
      CanExecuteChanged?.Invoke(this, EventArgs.Empty); 
     } 
    } 

    public bool CanExecute(object parameter) 
    { 
     return !string.IsNullOrEmpty(_model.Path); 
    } 

    public void Execute(object parameter) 
    { 
     ..... 
    } 

    public event EventHandler CanExecuteChanged; 
} 

私の見解で力を更新CanExecuteのためのテキストボックスへのユーザ入力は、いくつかのデータ

<Window x:Class="NameSpace.Views.AddEditWindow" 
    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:vm="clr-namespace:NameSpace.ViewModels" 
    mc:Ignorable="d" 
    Title="{Binding Path=WindowTitle}" 
    Height="200" 
    Width="500" 
    WindowStyle="SingleBorderWindow"> 
<Window.DataContext> 
    <vm:AddEditWindowViewModel /> 
</Window.DataContext> 
..... 
     <TextBox Name="Path" Text="{Binding Path=Path, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Margin="2" Grid.Column="0" Grid.Row="1"></TextBox> 
..... 
Button IsDefault="True" Command="{Binding Path=ConfirmCommand}" Margin="5" HorizontalAlignment="Right" Width="100" Grid.Row="2" Grid.Column="0" Content="Ok"></Button> 
    <Button IsCancel="True" Margin="5" HorizontalAlignment="Left" Width="100" Grid.Row="2" Grid.Column="1" Content="Cancel"></Button> 
..... 

テキストボックスuユーザーID:PorpertyChangedConfirmCommandのイベントは発生しません。どうして? どこが間違っていますか?

答えて

1

は、あなたのPathプロパティのセッターでOnPropertyChangedを呼び出すようにしてください:

private string _path; 

public string Path 
{ 
    get 
    { 
     return _path; 
    } 
    set 
    { 
     _path = value; 
     OnPropertyChanged(); 
    } 
} 
+0

その作業は、ありがとう:) –

0

(および場合のみ)場合は、PropertyChangedイベントを発生させる必要があり、あなたのプロパティの値が変更された:

private string _path; 

public string Path 
{ 
    get 
    { 
     return _path; 
    } 
    set 
    { 
     if (_path != value) 
     { 
      _path = value; 
      OnPropertyChanged(); 
     } 
    } 
} 
0

あなたは何のためにあります次のようなものを実装する:INotifyPropertyChangedConfirmCommand自分でですか?これがあなたのために行われたフレームワークはたくさんあります。そして、EventToCommand、ViewModelLocator、MessengerのようなMVVMアプローチの多くのものがあります。たとえば、https://msdn.microsoft.com/en-us/magazine/5eafc6fc-713a-4461-bc2b-469afdd03c31?f=255&MSPPError=-2147217396

関連する問題