简单的MVVM绑定问题

时间:2012-10-16 15:04:50

标签: wpf vb.net data-binding mvvm

我有一个文本框和一个按钮。 Button Command应该更改绑定到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>

视图模型:

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

2 个答案:

答案 0 :(得分: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

只有在implementing INotifyPropertyChanged correctly之后Binding才会在PropertyChanged事件后正确刷新MyName属性

答案 1 :(得分: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;
}