1

テキストボックスとボタンが1つずつあります。Buttonコマンドは、TextBoxにバインドされているプロパティを変更する必要があります。

しかし、コマンド実行後に視覚的な変化は見られません。wpfバインディングに関連する簡単な質問だと思います

この問題で私を助けてください

アプリのソース:

<UserControl.DataContext>
    <local:SampleViewModel />
</UserControl.DataContext>
<Grid>
    <StackPanel>
        <TextBox Height="23" Width="120" Text="{Binding MyName}"  />
        <Button Content="Click" Command="{Binding ButtonCommand}" />
    </StackPanel>
</Grid>

ViewModel:

Private _myName As String
Public Property MyName As String
  Get
    Return _myName
  End Get
  Set(value As String)
    _myName = value
      OnPropertyChanged("MyName")
  End Set
End Property

Public _buttonCommand As DelegateCommand
Public ReadOnly Property ButtonCommand As DelegateCommand
Get
  Return If(_buttonCommand IsNot Nothing, _buttonCommand, 
  New DelegateCommand(AddressOf Execute, AddressOf CanExecute))
End Get
End Property

Private Sub Execute()
  MyName = "Executed"
End Sub

Private Function CanExecute() As Boolean
  Return True
End Function

Public Event PropertyChanged As PropertyChangedEventHandler
Private Sub OnPropertyChanged(propertyName As String)
  RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propertyName))
End Sub
4

2 に答える 2

1

以下をせよ:

1.クラスMainWindowはINotifyPropertyChangedを実装します

2。Public Sub New()Me.DataContext = Meで、DataContextを設定するように記述していることを確認してください

:ViewModelを使用していて、XAMLで設定している場合は、手順2を無視してください。

3。次のようにProperyChangedを変更します。 Public Event PropertyChanged As PropertyChangedEventHandler Implements INotifyPropertyChanged.PropertyChanged

正しく実装INotifyPropertyChangedした後でのみ、BindingはPropertyChangedイベントの後にMyNameプロパティを正しく更新します。

于 2012-10-16T15:29:56.153 に答える
1

これがあなたの正確なXAMLで動作するコードです(私はhttp://wpftutorial.net/DelegateCommand.htmlからDelegateCommand実装を取りました)申し訳ありませんがC#です、私は本当にVBに興味がありません:D

public class DelegateCommand : ICommand
{
    private readonly Predicate<object> _canExecute;
    private readonly Action<object> _execute;

    public event EventHandler CanExecuteChanged;

    public DelegateCommand(Action<object> execute)
        : this(execute, null)
    {
    }

    public DelegateCommand(Action<object> execute,
                   Predicate<object> canExecute)
    {
        _execute = execute;
        _canExecute = canExecute;
    }

    public virtual bool CanExecute(object parameter)
    {
        if (_canExecute == null)
        {
            return true;
        }

        return _canExecute(parameter);
    }

    public virtual void Execute(object parameter)
    {
        _execute(parameter);
    }

    public void RaiseCanExecuteChanged()
    {
        if (CanExecuteChanged != null)
        {
            CanExecuteChanged(this, EventArgs.Empty);
        }
    }
}

public class SampleViewModel : INotifyPropertyChanged
{
    // Create the OnPropertyChanged method to raise the event 
    protected void OnPropertyChanged(string name)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(name));
        }
    }
    public event PropertyChangedEventHandler PropertyChanged;

    public DelegateCommand _buttonCommand;
    public DelegateCommand ButtonCommand
    {
        get
        {
            if (_buttonCommand == null)
            {
                _buttonCommand = new DelegateCommand(Execute);
            }
            return _buttonCommand;
        }
    }

    public void Execute(object o)
    {
        MyName = "executed";
    }

    public string MyName { get { return _myName; } set { _myName = value; OnPropertyChanged("MyName"); } }

    private string _myName;
}
于 2012-10-16T15:32:52.183 に答える