代码之家  ›  专栏  ›  技术社区  ›  Robby Smet

未显示更改

  •  0
  • Robby Smet  · 技术社区  · 12 年前

    我有一个名为AllUserViewModel的视图模型,它包含一个UserViewModel列表。
    UserViewModel与UserControl绑定。

    这是我的主窗口,对于每个用户,我都会将UserControl添加到堆栈面板容器中。

    public partial class MainWindow : Window
    {
        public AllUserViewModel allUserViewModel { get; set; }
    
        public MainWindow()
        {
            InitializeComponent();
            DwmDropShadow.DropShadowToWindow(this);
    
            allUserViewModel = new AllUserViewModel();
            this.DataContext = allUserViewModel;
    
            allUserViewModel.Users.Add(new UserViewModel(new User(1, "Robby", "Bezet")));
            allUserViewModel.Users.Add(new UserViewModel(new User(2, "Erwin", "Bezet")));
            allUserViewModel.Users.Add(new UserViewModel(new User(3, "Kevin", "Bezet")));
    
            foreach (UserViewModel u in allUserViewModel.Users)
            {
                Container.Children.Add(new UserControlButton(u));
            }
    
            Container.MouseEnter += new MouseEventHandler(Container_MouseEnter);
        }
    
        void Container_MouseEnter(object sender, MouseEventArgs e)
        {
            UserViewModel u = allUserViewModel.GetUser(2);
            u.Name = "Laurens";   // Doesn't work
        }
    }
    

    我向每个UserControlButton传递一个UserViewModel

    public partial class UserControlButton : UserControl
    {
        public UserViewModel userViewModel { get; set; }
    
        public UserControlButton(UserViewModel u)
        {
            this.InitializeComponent();
            this.DataContext = u;
        }
    }
    

    这是我的UserControlButton

    <UserControl
    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:i="http://schemas.microsoft.com/expression/2010/interactivity" xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions"
    xmlns:ee="http://schemas.microsoft.com/expression/2010/effects"
    mc:Ignorable="d"
    x:Class="UserControlSolution.UserControlButton"
    x:Name="UserControl"
    Height="50" Background="#FF2F2F2F"
    VerticalAlignment = "Top"
    Margin="2,0,0,5"
    >
    
        <StackPanel x:Name="UserContainer" Orientation="Vertical" VerticalAlignment="Center" Grid.Column="1" Background="{DynamicResource DarkGrey}">
            <TextBlock x:Name="NameLabel" FontSize="16" Foreground="#FFE5E5E5" Text="{Binding Name}" VerticalAlignment="Top" FontFamily="Segoe UI Semibold" RenderTransformOrigin="0.5,0.5" Margin="0,0,0,2"/>
            <TextBlock x:Name="UserStatusLabel" Text="{Binding UserStatus}" TextWrapping="NoWrap" VerticalAlignment="Top" Foreground="#FFE5E5E5" />
        </StackPanel>
    
    </UserControl>
    

    所有用户视图模型

    public class AllUserViewModel : BaseViewModel
    {
        ObservableCollection<UserViewModel> _users;
    
        public AllUserViewModel()
        {
            Users = new ObservableCollection<UserViewModel>();
        }
    
        /// <summary>
        /// Observable Collection of Users
        /// Uses INotifyPropertyChange when list changes
        /// </summary>
        public ObservableCollection<UserViewModel> Users
        {
            get { return _users; }
            set
            {
                if (_users != value)
                {
                    _users = value;
                    NotifyPropertyChanged("Users");
                }
            }
        }
    
        public void AddUser(User user)
        {
            UserViewModel userViewModel = new UserViewModel(user);
            Users.Add(userViewModel);
        }
    
        public UserViewModel GetUser(int ID)
        {
            foreach (UserViewModel u in Users)
            {
                if(u.ID == ID)
                    return u;
            }
    
            return null;
        }
    }
    

    和UserViewModel

    public class UserViewModel : BaseViewModel
    {
        readonly User _user;
    
        public UserViewModel(User user)
        {
            if (user == null)
                throw new ArgumentNullException("User");
    
            _user = user;
        }
    
        public string Name
        {
            get { return _user.Name; }
            set
            {
                if (value == _user.Name)
                    return;
    
                _user.Name = value;
    
                NotifyPropertyChanged("UserName");
            }
        }
    
        public string UserStatus
        {
            get { return _user.UserStatus; }
            set
            {
                if (value == _user.UserStatus)
                    return;
    
                _user.UserStatus = value;
    
                NotifyPropertyChanged("UserStatus");
            }
        }
    
        public int ID
        {
            get { return _user.ID; }
        }
    }
    

    问题是,最初显示的是3个用户,但当我尝试更改鼠标输入事件上的名称时,尽管触发了NotifyPropertyChanged,但名称并没有更改。

    1 回复  |  直到 12 年前
        1
  •  2
  •   franssu    12 年前
    public string Name
    {
        get { return _user.Name; }
        set
        {
            if (value == _user.Name)
                return;
    
            _user.Name = value;
    
            NotifyPropertyChanged("UserName");
        }
    }
    

    您的属性名为Name,但您为名为UserName的属性引发了PropertyChanged事件!