【发布时间】:2023-04-06 01:46:01
【问题描述】:
我是 WPF 框架的新手。文本框的属性“文本”的数据绑定不起作用。不知道代码有没有问题?
我有一个名为“ConfigListBox”的列表框和一个名为“NameTextBox”的文本框。
<ListBox x:Name="ConfigListBox" Grid.Row="0" Loaded="ConfigListBox_OnLoaded">
<ListBox.ItemTemplate>
<DataTemplate DataType="MyApp:Config">
<WrapPanel>
<CheckBox Margin="0, 0, 2, 0"/>
<TextBlock Text="{Binding Name}" />
</WrapPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
<TextBox Name="NameTextBox" Grid.Column="1" Grid.Row="0" Text="{Binding SelectedConfig.Name}"></TextBox>
Object _selectedConfig 是 ConfigListBox 的选中项的实例。 _selectedConfig 将在 ConfigListBox 处于选定索引更改事件时更新。
public partial class MainWindow : Window, INotifyPropertyChanged
{
private List<Config> _configs = new List<Config>();
private Config _selectedConfig;
public Config SelectedConfig
{
get => _selectedConfig;
set
{
_selectedConfig = value;
OnPropertyChanged();
}
}
public MainWindow()
{
InitializeComponent();
}
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
Config 类实现了 INotifyPropertyChanged 接口。
class Config : INotifyPropertyChanged
{
public string Name { get; set; }
public event PropertyChangedEventHandler PropertyChanged;
[NotifyPropertyChangedInvocator]
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
找到数据上下文元素:? DataItem=null?,详细日志:
System.Windows.Data Warning: 67 : BindingExpression (hash=55056607): Resolving source
System.Windows.Data Warning: 70 : BindingExpression (hash=55056607): Found data context element: <null> (OK)
System.Windows.Data Warning: 74 : Lookup name _selectedConfig: queried TextBox (hash=14620943)
System.Windows.Data Warning: 67 : BindingExpression (hash=55056607): Resolving source
System.Windows.Data Warning: 70 : BindingExpression (hash=55056607): Found data context element: <null> (OK)
System.Windows.Data Warning: 74 : Lookup name _selectedConfig: queried TextBox (hash=14620943)
System.Windows.Data Warning: 67 : BindingExpression (hash=55056607): Resolving source
System.Windows.Data Warning: 70 : BindingExpression (hash=55056607): Found data context element: <null> (OK)
System.Windows.Data Warning: 74 : Lookup name _selectedConfig: queried TextBox (hash=14620943)
System.Windows.Data Warning: 67 : BindingExpression (hash=55056607): Resolving source (last chance)
System.Windows.Data Warning: 70 : BindingExpression (hash=55056607): Found data context element: <null> (OK)
System.Windows.Data Warning: 74 : Lookup name _selectedConfig: queried TextBox (hash=14620943)
System.Windows.Data Error: 4 : Cannot find source for binding with reference 'ElementName=_selectedConfig'. BindingExpression:Path=Name; DataItem=null; target element is 'TextBox' (Name='NameTextBox'); target property is 'Text' (type 'String')
【问题讨论】:
-
Name属性不使用OnPropertyChanged -
对不起@styx,我没听懂你。你的意思是 _selectedConfig = ConfigListBox.SelectedItem as Config;不会触发 Config 对象中定义的属性更改事件?
-
请看here
-
谢谢@styx。试过你的文章,不行。但我发现有人在其他问题中提到了名称范围。
标签: c# wpf data-binding