【问题标题】:Wpf Listview bound object does not have changesWpf Listview绑定对象没有变化
【发布时间】:2011-05-20 10:22:54
【问题描述】:

我在一列中有带有文本框的列表视图。 Listview 绑定到 IEnumerable 集合。 当我在文本框中编辑文本并单击“确定”时,绑定的集合只有原始值。
我窥探了列表视图,当列表视图在屏幕上时,在文本框中所做的更改出现在列表视图项的对象中,但在确定按钮处理程序中它们都消失了。

这是窗口的 xaml 和代码隐藏(收款人是窗口调用者产生的 linq-to-xml 查询的结果):

<Grid>  
    <ListView HorizontalAlignment="Stretch" Margin="0,38,0,0" Name="lvPayee" 
                        VerticalAlignment="Stretch" GridViewColumnHeader.Click="lvPayee_Click" Background="AliceBlue">  
        <ListView.View>  
            <GridView>  
                <GridView.Columns>  
                    <GridViewColumn Header="Listed" Width="60">  
                        <GridViewColumn.CellTemplate>  
                            <DataTemplate>  
                                <CheckBox Margin="15,0,0,0" IsChecked="{Binding Listed}"/>  
                            </DataTemplate>  
                        </GridViewColumn.CellTemplate>  
                    </GridViewColumn>  
                    <GridViewColumn Header="Payee" Width="425">  
                        <GridViewColumn.CellTemplate>  
                            <DataTemplate DataType="{x:Type TextBox}">  
                                <TextBox Width="420" Text="{Binding Name}" Background="Transparent"/>  
                            </DataTemplate>   
                        </GridViewColumn.CellTemplate>  
                    </GridViewColumn>  
                    <GridViewColumn Header="Use Count" Width="80" DisplayMemberBinding="{Binding UseCount}"/>  
                </GridView.Columns>  
            </GridView>  
        </ListView.View>  
    </ListView>  
    <CheckBox Content="Listed Only" Height="27" HorizontalAlignment="Left" Margin="57,12,0,0" Name="cbListedOnly" VerticalAlignment="Top" Width="129" IsChecked="True" Click="Listed_Clicked" />  
    <Button Content="OK" Height="27" HorizontalAlignment="Left" Margin="381,6,0,0" Name="btnOK" VerticalAlignment="Top" Width="89" Click="OK_Clicked" />  
    <Button Content="Cancel" Height="27" HorizontalAlignment="Left" Margin="493,6,0,0" Name="btnCancel" VerticalAlignment="Top" Width="80" IsCancel="True" />  
</Grid>  


public partial class PayeeManager : Window
{
    private IEnumerable<Payee> payees = null;
    private IEnumerable<Payee> payto = null;
    private bool reverse = false;
    private string lastColumn = "";

    public PayeeManager(Window owner, IEnumerable<Payee> payees)
    {
        this.Owner = owner;
        this.payees = payees;
        InitializeComponent();

        payto = from p in this.payees
                        where p.Listed == true
                        orderby p.Name
                        select p;

        lvPayee.ItemsSource = payto;
    }

    public class Payee 
    {
        public string Name { get; set; }
        public int UseCount { get; set; }
        public bool Listed { get; set; }

        public string OldName { get; set; }
        public bool OldListed { get; set; }
    }

    private void Listed_Clicked(object sender, RoutedEventArgs e)
    {
        payto = from p in this.payees
                        where cbListedOnly.IsChecked == true ? p.Listed == true : true
                        select p;

        lvPayee.ItemsSource = payto;
    }

    private void lvPayee_Click(object sender, RoutedEventArgs e)
    {
        if (!(e.OriginalSource is GridViewColumnHeader)) return;

        string header = (string)((GridViewColumnHeader)e.OriginalSource).Column.Header;
        if (lastColumn != header)
        {
            lastColumn = header;
            reverse = false;
        }
        else reverse = !reverse;

        switch (header)
        {
            case "Listed":
                    payto = from p in this.payees
                                    where cbListedOnly.IsChecked == true ? p.Listed == true : 1 == 1
                                    orderby p.Listed
                                    select p;
                break;
            case "Payee":
                    payto = from p in this.payees
                                    where cbListedOnly.IsChecked == true ? p.Listed == true : 1 == 1
                                    orderby p.Name
                                    select p;
                break;
            case "Use Count":
                    payto = from p in this.payees
                                    where cbListedOnly.IsChecked == true ? p.Listed == true : 1 == 1
                                    orderby p.UseCount
                                    select p;
                break;
            default:
                return;
        }
        if (reverse) payto = payto.Reverse();
        lvPayee.ItemsSource = payto;
    }

    private void OK_Clicked(object sender, RoutedEventArgs e)
    {
        DialogResult = true;
    }
}

【问题讨论】:

  • where !cbListedOnly.IsChecked || p.Listed
  • 与手头的问题无关。问题是如何将更改从这个窗口传递给调用者。

标签: wpf listview binding


【解决方案1】:

我发现了问题。我用作listview的ItemSource Linq查询,访问时刷新,丢失更改。我将 ItemSource 更改为 List,在查询中使用 ToList(),它现在可以工作了。

【讨论】:

    猜你喜欢
    • 2017-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-28
    • 2013-03-06
    • 2016-09-23
    • 1970-01-01
    相关资源
    最近更新 更多