【发布时间】:2015-03-14 14:21:10
【问题描述】:
我遇到了过去两天无法解决的绑定问题。我已经彻底浏览了 SO 上的大部分相关线程,但我仍然无法确定我的错误所在。
我遇到的问题是程序中的一个文本框。它的目的是显示用户从文件浏览器中选择的文件。我已将它的文本属性绑定到一个名为 parameterFileSelected 的字符串,但即使调试似乎显示 iNotifyPropertyChanged 已正确调用和执行,文本框也不会更新。
如果我的代码有任何错误,请帮我看看下面的代码。
文本框是名为 GenerateReports 的 xaml 的一部分,此视图与 GenerateReportsViewModel 相关联,如下所示:
将 datacontext 设置为 GenerateReportsViewModel 的代码
<Grid >
<Grid.DataContext>
<vm:GenerateReportsViewModel/>
</Grid.DataContext>
<Grid.ColumnDefinitions>
....
文本框的代码。我曾尝试删除双向模式,将其更改为单向并删除模式,但没有区别。
<TextBox Grid.Column="2" Grid.Row="1" Margin="5" Text="{Binding parameterFileSelected, Mode=Twoway, UpdateSourceTrigger=PropertyChanged}" ></TextBox>
获取文件浏览器,然后将选择的文件结果传递给 GenerateReportsViewModel,这是代码隐藏文件中的函数。 genviewmodel 在代码隐藏文件的开头被初始化为GenerateReportsViewModel genViewModel = new GenerateReportsViewModel();
private void ParaFileButtonClick(object sender, RoutedEventArgs e)
{
OpenFileDialog openFileDialog = new OpenFileDialog();
if (openFileDialog.ShowDialog() == true)
{
DataContext = genViewModel;
genViewModel.updateParameterFileSelected(openFileDialog.FileName.ToString());
}
}
这是在 GenerateReportsViewModel 中调用的代码,用于更新文本框绑定到的 parameterFileSelected 字符串。
class GenerateReportsViewModel : ViewModelBase
{
private string _parameterFileSelected;
public string parameterFileSelected
{
get { return _parameterFileSelected; }
set { SetValue(ref _parameterFileSelected, value); }
}
public void updateParameterFileSelected(string parameterFile)
{
parameterFileSelected = parameterFile;
}
}
这是视图模型附加到的 ViewModelBase。
public class ViewModelBase : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public void SetValue<T>(ref T property, T value, [CallerMemberName] string propertyName = null)
{
if (property != null)
{
if (property.Equals(value)) return;
}
OnPropertyChanged(propertyName);
property = value;
}
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
var handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
}
}
编辑 应用凯文的建议后的工作解决方案
为简单起见,Datacontext 在 XAML 中设置。
<Grid>
<Grid.DataContext>
<vm:GenerateReportsViewModel x:Name="generateReportsViewModel"/>
</Grid.DataContext>
然后,我在视图模型中直接从后面的代码中调用文本框绑定的字符串。
private void ParaFileButtonClick(object sender, RoutedEventArgs e)
{
OpenFileDialog openFileDialog = new OpenFileDialog();
if (openFileDialog.ShowDialog() == true)
{
generateReportsViewModel.parameterFileSelected = openFileDialog.FileName.ToString();
}
}
ViewModel 现在使用 Kevin 的 ViewModelBase:
public class GenerateReportsViewModel : ViewModelBase
{
public string parameterFileSelected
{
get { return this.GetValue<string>(); }
set { this.SetValue(value); }
}
}
感谢凯文的解决方案。现在我为期 2 天的问题解决了。
我发现我以前的 ViewModelBase 正在调用 iNotifyPropertyChanged,但不知何故,当视图更新时,该值改为 null。
【问题讨论】:
标签: c# wpf data-binding textbox viewmodel