【问题标题】:How to refresh value of member property on a TextBox - mvvm如何刷新文本框上的成员属性值 - mvvm
【发布时间】:2019-08-23 11:21:13
【问题描述】:

我是 mvvm 的初学者,为了学习它,我想构建某种应用程序。所以我正在做一些类似我的电影、文件等的数据库。我想在设置中选择像所有文件的主文件夹这样的东西。像父节点这样的东西。

为此,我使用旁边带有按钮 [...] 的文本框。 文本块应该仅用于显示文件的路径。

程序启动后,在textBox内显示默认值,但之后我无法捕捉到变化。 FileInfo 属性被更改,属性也可以从中检索路径。还调用了 OnPropertyChanged() 但复选框仍处于默认状态,没有值更改。你知道为什么它不适合我吗?谢谢!

class SettingsViewModel : ObservableObject, IPageViewModel
{
    private AppSettings settings;

    public AppSettings Settings { get => settings;}

       public SettingsViewModel()
            {
                settings = new AppSettings();
            }
       private void ChangeFilmsFolderButton_Click(object obj)
            {
                string name = Settings.GeneralFilmsFolderPath; //old value
                Settings.AddPathToFilmsFolder();
                name = Settings.GeneralFilmsFolderPath; //new value
            }
    }

    class AppSettings : ObservableObject
    {   
            private FileInfo _generalFilmsFolder;
            private string _generalFilmsFolderPath;

            public FileInfo GeneralFilmsFolder
            {
                get => _generalFilmsFolder;
                set
                {
                    _generalFilmsFolder = value;
                    GeneralFilmsFolderPath = _generalFilmsFolder.FullName;
                }
            }

            public string GeneralFilmsFolderPath {
                get => _generalFilmsFolderPath;
                set {
                    _generalFilmsFolderPath = value;
                    OnPropertyChanged("GeneralFilmsFolderPath");
                }
            }


            public void AddPathToFilmsFolder()
            {
                CommonOpenFileDialog dialog = new CommonOpenFileDialog();
                dialog.InitialDirectory = "C:\\Users";
                dialog.IsFolderPicker = true;
                dialog.Multiselect = false;

                if (dialog.ShowDialog() == CommonFileDialogResult.Ok)
                {
                    if (Directory.Exists(dialog.FileName))
                        GeneralFilmsFolder = new FileInfo(dialog.FileName);
                }
            }

    }

SettingsView XAML

<TextBox IsReadOnly="True" HorizontalAlignment="Left" Height="20" Margin="74,2,0,0" TextWrapping="Wrap" Text="{Binding Settings.GeneralFilmsFolderPath, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" VerticalAlignment="Top" Width="73"/>

【问题讨论】:

  • 您是否尝试过仅使用 INotifyPropertyChanged 而不是使用来自 MVVM 灯光的 ObservableObject?

标签: mvvm inotifypropertychanged propertygrid


【解决方案1】:

我想我明白你的问题是什么。当您更改文件路径时,它似乎没有更新文本框。以下是我为我的应用程序进行文本框绑定的方法。

    public class AddTubeViewModel : INotifyPropertyChanged
    {
        /// <summary>
        /// Raised when a property on this object has a new value.
        /// </summary>
        public event PropertyChangedEventHandler PropertyChanged;

        /// <summary>
        /// Raises this object's PropertyChanged event.
        /// </summary>
        /// <param name="propertyName">The property that has a new value.</param>
        private void RaisePropertyChanged([CallerMemberName]string propertyName = "")
        {
            this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }

        private string _rowText;
        /// <summary>
        /// The text value of the row textbox
        /// </summary>
        public string RowText
        {
            get { return _rowText; }
            set
            {
                _rowText = value;
                RaisePropertyChanged();
            }
        }

在 AddTubeView.xml 中

<TextBox x:Name="RowTextbox" Style="{StaticResource AddTubeTextbox}" PlaceholderText="Row #" Text="{Binding RowText, Mode=TwoWay}"/>

在这种情况下,我将 RaisePropertyChanged 事件添加到每个实现 INotifyPropertyChanged 的​​类的顶部。它不需要参数,因为它会自动将调用它的对象作为参数。

要正确进行此更新,我要做的只是让我的 VM 中的任何代码执行 RowText = "NewText";,这将在应用运行时自动在视图中更新。

希望这会有所帮助!如果我弄错了您的问题的上下文,请告诉我,我很乐意提供帮助:)

【讨论】:

  • 我有 OnNotifyChanges 的东西是在 ObservableObject 内部实现的,所以很好。按照你的步骤,现在它可以工作了。之前的一切都是以同样的方式实现的。感谢您的帮助。
猜你喜欢
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-06
  • 2011-02-19
  • 2019-01-18
  • 2012-02-29
  • 2013-01-05
相关资源
最近更新 更多