繁体   English   中英

WPF ListView ItemTemplate中的文本框绑定

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM