Wpf Listview связанный объект не имеет изменений - PullRequest
0 голосов
/ 05 декабря 2010

У меня есть просмотр списка с текстовым полем в одном столбце. Listview привязан к коллекции IEnumerable. Когда я редактирую текст в текстовых полях и нажимаю кнопку ОК, связанная коллекция имеет только исходные значения.
Я проследил просмотр списка и увидел, что изменения, сделанные в текстовых полях, появляются в объектах listviewitem, пока listview находится на экране, но в обработчике кнопки OK все они исчезли.

Вот xaml и code-behind окна (получатель платежа является результатом запроса 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;
    }
}

1 Ответ

0 голосов
/ 06 декабря 2010

Я нашел проблему. Я использовал запрос ListSource Linq в качестве списка, и он обновлялся при обращении, теряя изменения. Я изменил ItemSource на List, используя ToList () для запроса, и теперь он работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...