[英]TextBox Binding inside WPF ListView ItemTemplate
我试图将一个文本框绑定到我的listview的itemtemplate中。 作为itemssource,我正在使用ObservableCollection。 我已经尝试通过{Binding}将itemtemplate绑定到数据上下文本身,但是它给了我InvalidOperationException。 这是相关的片段
<ListView Name="listOrder" ItemsSource="{Binding OrderBys,UpdateSourceTrigger=PropertyChanged}" HorizontalContentAlignment="Stretch">
<ListView.ContextMenu>
<ContextMenu>
<MenuItem Name="AddOrder" Header="Sıra Ekle" Click="AddOrder_Click" />
</ContextMenu>
</ListView.ContextMenu>
<ListView.ItemTemplate>
<DataTemplate>
<TextBox FontSize="10" Text="{Binding}"></TextBox>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
这是ViewModel的相关部分
public class ViewModel_ReportDesigner : ViewModelBase
{
//Tables
public List<string> Tables
{
get
{
Reporting.ReportUtils rr = new Reporting.ReportUtils();
return rr.GetChildList("IGAEntities");
}
}
private string _selectedTable;
public string SelectedTable {
get
{
return _selectedTable;
}
set
{
_selectedTable = value;
RaisePropertyChangedEvent("SelectedTable");
RaisePropertyChangedEvent("Fields");
}
}
//Fields
public ObservableCollection<string> Fields
{
get
{
Reporting.ReportUtils rr = new Reporting.ReportUtils();
if (SelectedTable != null)
{
return new ObservableCollection<string>(rr.GetChildList(SelectedTable));
}
return null;
}
}
//Number of Fields
private int _NumberOfFields;
public int NumberOfFields
{
get
{
return _NumberOfFields;
}
set
{
_NumberOfFields = value;
RaisePropertyChangedEvent("NumberOfFields");
}
}
public ObservableCollection<ReportField> getEmptyFieldList()
{
ObservableCollection<ReportField> list = new ObservableCollection<ReportField>();
for (int i = 1; i <= _NumberOfFields; i++)
{
list.Add(new ReportField("''", i.ToString()));
}
return list;
}
//Groups
private List<string> _Groups;
public List<string> Groups
{
get
{
if (_Groups == null)
{
_Groups = new List<string>();
}
return _Groups;
}set
{
_Groups = value;
RaisePropertyChangedEvent("Groups");
}
}
//TableCreators
private ObservableCollection<TableCreator> _TableCreators;
public ObservableCollection<TableCreator> TableCreators
{
get
{
if (_TableCreators == null)
_TableCreators = new ObservableCollection<TableCreator>();
return _TableCreators;
}
set
{
_TableCreators = value;
RaisePropertyChangedEvent("TableCreators");
}
}
private TableCreator _SelectedTableCreator;
public TableCreator SelectedTableCreator
{
get
{
return _SelectedTableCreator;
}
set
{
_SelectedTableCreator = value;
RaisePropertyChangedEvent("SelectedTableCreator");
}
}
internal void RaiseChanged(string v)
{
RaisePropertyChangedEvent(v);
}
}
实际上我正在谈论的listview在另一个listview中。 弄清楚一切。 当我将项目添加到父级列表视图时,我创建了一个空列表并将其绑定到子级列表视图。 然后从上下文菜单中添加这样的相关元素
vm.SelectedTableCreator.OrderBys.Add("");
vm.RaiseChanged("TableCreators");
编辑:现在我意识到我的绑定是正确的,唯一的问题是我更改文本框内的文本后,不会触发文本框更改事件。
如果您的绑定正确,则必须将文本框的绑定模式设置为"TwoWay"
喜欢:
<TextBox FontSize="10" Text="{Binding bla, Mode=TwoWay}"></TextBox>
因为,如果您未设置模式,则标准模式为Mode = OneTime
这里有不同的模式,如果您不知道他们。
现在我意识到绑定是正确的,唯一的问题是在更改文本框内的文本后,文本框更改事件不会触发。
那么您应该在模型类中实现INotifyPropertyChanged
:
public class TableCreator:INotifyPropertyChanged
{
private string yourVariable;
public string YourVariable
{
get { return YourVariable; }
set {
YourVariable =value;
OnPropertyChanged("YourVariable");
}
}
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
正如MSDN所说 :
原因
INotifyPropertyChanged0
通知客户端(UI)属性值已更改。
如以下示例所示:
public class Person:INotifyPropertyChanged
{
public int IdPerson { get; set; }
private string name;
public string Name
{
get { return name; }
set {
name =value;
OnPropertyChanged("Name");
}
}
private string surname;
public string SurName
{
get { return surname; }
set
{
surname = value;
OnPropertyChanged("SurName");
}
}
public event PropertyChangedEventHandler PropertyChanged;
public void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.