如何在xaml中向Window添加属性

时间:2013-12-02 04:35:52

标签: wpf mvvm

我正在通过使用Login功能编写一个litle app来学习MVVM。在View层中,我有一个带有这样的绑定的LoginWindow:

<TextBox x:Name="tbxUsername" Grid.Row="0" Grid.Column="1" Width="150" Height="22" Margin="15,10,5,10" 
    Text="{Binding Path=Username, UpdateSourceTrigger=PropertyChanged}" />

<PasswordBox View:PasswordHelper.Attach="True" View:PasswordHelper.Password="{Binding Path=Password, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"
    x:Name="pwdPassword" Grid.Row="1" Grid.Column="1"  Width="150" Height="22" Margin="15,10,5,10" />

问题是我想实现这样的绑定:

<Window.Authenticated={Binding Path=Authenticated, UpdateSourceTrigger=PropertyChanged, Mode=OneWay, NotifyOnTargetUpdated=True} TargetUpdated="authenticated_TargetUpdated"/>

Authenticated是一个bool值,它将在我的viewmodel中更改。 我有办法吗?

编辑@lain: 这是我的LoginWindow.xaml(样式和布局已删除)。

<Window x:Class="ATCheck_View.LoginWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:View="clr-namespace:ATCheck_View"
        xmlns:ViewModel="clr-namespace:ATCheck_ViewModel;assembly=ATCheck_ViewModel"
        Title="Login" 
        WindowStartupLocation="CenterScreen"
        ResizeMode="CanMinimize"
        SizeToContent="WidthAndHeight"
        >


    <Window.DataContext>
        <ViewModel:LoginViewModel />
    </Window.DataContext>
    <Grid>
            <TextBox x:Name="tbxUsername" Grid.Row="0" Grid.Column="1" 
                Width="150" Height="22" Margin="15,10,5,10" Text="{Binding Path=Username, UpdateSourceTrigger=PropertyChanged, TargetNullValue='atcheck', NotifyOnTargetUpdated=True}"/>

            <PasswordBox View:PasswordHelper.Attach="True" View:PasswordHelper.Password="{Binding Path=Password, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay, TargetNullValue='123456'}" x:Name="pwdPassword" Grid.Row="1" Grid.Column="1" 
                Width="150" Height="22" Margin="15,10,5,10" />

            <Button x:Name="btnLogin" Width="65" Height="20" Margin="5,15,10,12"
                    Command="{Binding LoginCommand}"
                    CommandParameter="">
                <TextBlock VerticalAlignment="Center">Login</TextBlock>
            </Button>
            <Button x:Name="btnCancel" Width="60" Height="20" Margin="5,15,5,12" Click="btnCancel_Click">
                <TextBlock VerticalAlignment="Center">Cancel</TextBlock>
            </Button>
    </Grid>
</Window>

LoginViewModel:

public class LoginViewModel: ViewModelBase
    {
        private string _username;
        private string _password;
        private bool _authenticated = false;

        public string Username
        {
            get
            {
                return _username;
            }
            set
            {
                _username = value;
                RaisePropertyChangedEvent("Username");
            }
        }

        public string Password
        {
            get
            {
                return _password;
            }
            set
            {
                _password = value;
                RaisePropertyChangedEvent("Password");
            }
        }

        public bool Authenticated
        {
            get
            {
                return _authenticated;
            }
            private set
            {
                _authenticated = value;
                RaisePropertyChangedEvent("Authenticated");
            }
        }

        public ICommand LoginCommand
        {
            get
            {
                return new RelayCommand<string>(Login);
            }
        }

        private void Login(string p)
        {
            Authenticated = true;
            Console.WriteLine("Infomation:");
            Console.WriteLine(Authenticated);
            Console.WriteLine(Username);
            Console.WriteLine(Password);
        }

    }

ViewModelBase实现了我在John Smith的文章中提到的INotifyPropertyChanged和RelayCommand。

@nit:我试过你的主角,propdp,重建,并输入Authenticated folow“Window”标签,但当我按下commbo Ctrl + Space时没有任何反应。

我想要做的是一个消息框,当Authenticated从False变为True时将显示:

private bool _authenticated = false;
public bool Authenticated
{
    get
    {
        return _authenticated;
    }
    set
    {
        if (value == true)
        {
            MessageBox.Show("Logged!");
        }
    }
}

public LoginWindow()
{
    InitializeComponent();
    LoginViewModel myViewModel = (LoginViewModel)this.DataContext;
    myViewModel.PropertyChanged += myViewModel_PropertyChanged;

}

void myViewModel_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
    if (e.PropertyName == "Authenticated")
    {
        Authenticated = ((LoginViewModel)sender).Authenticated;
    }
}

1 个答案:

答案 0 :(得分:0)

您必须将DependencyProperty添加到您的Window类中,如下所示:

 public static readonly DependencyProperty AuthenticatedProperty = 
         DependencyProperty.Register( "Authenticated", typeof(bool),
         typeof(YOURWINDOWCLASS), new FrameworkPropertyMetadata(false));

// .NET Property wrapper
public bool Authenticated
{
    get { return (bool)GetValue(AuthenticatedProperty ); }
    set { SetValue(AuthenticatedProperty , value); }
}

然后你可以绑定

<Window Authenticated={Binding Path=Authenticated, UpdateSourceTrigger=PropertyChanged, Mode=OneWay, NotifyOnTargetUpdated=True} TargetUpdated="authenticated_TargetUpdated"/>