在Codebehind中更改绑定文本框不更新

时间:2015-07-29 22:22:15

标签: c# .net wpf wcf-binding

我从其他项目中复制了此代码,无法弄清楚它为什么不起作用。我的可观察集合正在进行很好的绑定和更新,但我的文本框并没有改变。我有一个按钮单击,允许用户选择一个目录(DirectoryBrowse()方法),然后将该值分配给绑定到文本框的数据上下文属性。 PropertyChanged始终为空,我无法弄清楚原因!初始绑定工作正常,只需注意我在代码隐藏中更改值时。我已经完成了这么长时间,但任何帮助都会受到赞赏!

DataContext上课:

[Serializable]
public class Settings : ViewModels.ViewModelEntity
{
    public static Settings defaultSettings { get; set; }

    private string _ExportDir;
    public string ExportDir
    {
        get { return this._ExportDir; }
        set
        {
            if (this._ExportDir != value)
            {
                this._ExportDir = value;
                this.NotifyPropertyChanged("ExportDir");
            }
        }
    }

    private string _LastRunTime;
    public string LastRunTime
    {
        get { return this._LastRunTime; }
        set
        {
            if (this._LastRunTime != value)
            {
                this._LastRunTime = value;
                this.NotifyPropertyChanged("LastRunTime");
            }
        }
    }

    private string _TSCertPath;
    public string TSCertPath
    {
        get { return this._TSCertPath; }
        set
        {
            if (this._TSCertPath != value)
            {
                this._TSCertPath = value;
                this.NotifyPropertyChanged("TSCertPath");
            }
        }
    }

    public ObservableCollection<Map> Brokers { get; set; }
    public ObservableCollection<Account> Accounts { get; set; }

    public List<Holiday> Holidays { get; set; }
    public bool RefreshHolidays { get; set; }
    public string ProxyServer { get; set; }
    public string ProxyPort { get; set; }
    public string ProxyUsername { get; set; }
    public string ProxyPassword { get; set; }
    public bool TSProd { get; set; }
    public string TSTriad { get; set; }
    public string TSPassword { get; set; }
    public string TSCertPassword { get; set; }

    public Settings()
    {
        this.Brokers = new ObservableCollection<Map>();
        this.Accounts = new ObservableCollection<Account>();
    }
}

的Xaml:

<TextBlock TextWrapping="Wrap" Text="File Export Path*"/>
<TextBox TextWrapping="Wrap" Text="{Binding Path=ExportDir, Mode=TwoWay}" />
<Button x:Name="btnBrowseExportDir" Content="..." Click="btnBrowseExportDir_Click"/>

代码隐藏:

public MainWindow()
{
    InitializeComponent();
    Settings.Initialize();
    this.DataContext = Settings.defaultSettings;

    string[] args = Environment.GetCommandLineArgs();

    if (args.Contains("create"))
    {
        this.Close();
    }
}

private string DirectoryBrowse()
{
    CommonOpenFileDialog dialog = new CommonOpenFileDialog();
    dialog.IsFolderPicker = true;
    CommonFileDialogResult result = dialog.ShowDialog();

    if (result.ToString().ToUpper() == "OK")
    {
        if (!Directory.Exists(dialog.FileNames.First()))
        {
            this.lblStatus.Text = "Invalid directory selected";
            return string.Empty;
        }
        else
        {
            return dialog.FileNames.First();
        }
    }
    else
    {
        this.lblStatus.Text = "Invalid directory selected";
        return string.Empty;
    }
}

private void btnBrowseExportDir_Click(object sender, RoutedEventArgs e)
{
    Settings.defaultSettings.ExportDir = DirectoryBrowse();
}

ViewModelEntity

public class ViewModelEntity
{
    public event PropertyChangedEventHandler PropertyChanged;

    public virtual void NotifyPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}

2 个答案:

答案 0 :(得分:0)

永远不会为

Settings.defaultSettings分配值。所以数据绑定无关紧要。

Settings.Initialize()的Thoug代码丢失了。

答案 1 :(得分:0)

@Dave和@Icepickle向我展示了我所缺少的内容,没有实现INotifyPropertyChanged!