簡體   English   中英

綁定到ObservableCollection的ListView <T> 添加到媒體資源時不更新

[英]ListView bound to ObservableCollection<T> Doesn't update when Added to property

我正在構建一個文件資源管理器,當用戶DoubleClicks TreeView時會觸發此事件。 這將填充一個ObservableCollection<T> ,該ObservableCollection<T>綁定到名為File_List的ListView。FillCollection方法確實使用正確的Information填充FileList。

我已將其從填寫c#更改為綁定,因為我認為它將更易於維護。 謝謝你的時間。 這樣告訴我刺穿INotifyPropertyChanged我有與RaisedPropertyChanged方法。

private void folderItems_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
    try
    {

        TreeViewItem item = (TreeViewItem)folderItems.SelectedItem;
        FileAttributes attr = File.GetAttributes(item.Tag.ToString());
        if ((attr & FileAttributes.Directory) == FileAttributes.Directory)
        {
            _ViewModel.FileList = FillFileModel.FillCollection(item.Tag.ToString());
        }
        else
        {
           //Do something else
        }

    }
    catch (Exception) { }
}

FillFileModel類

public static ObservableCollection<Files> FillCollection(string Path)
{
    ObservableCollection<Files> files = new ObservableCollection<Files>();

    var searchDirectory = new DirectoryInfo(Path);
    try
    {
        Files getFile;
        foreach (var file in searchDirectory.GetFiles())
        {
            getFile = new Files
            {
                FileName = file.Name,
                FileSize = file.Length.ToString("#,##0 KB"),
                DateModified = file.LastWriteTime,
                FileType = getFileType(file.FullName)
            };

            files.Add(getFile);
        }
    }
    catch (Exception)
    {
    }
    return files;
}

綁定的屬性:

public ObservableCollection<Files> FileList
{
    get { return _FileList; }
    set
    {
        if (_FileList!=value)
        {
            _FileList = value;
            RaisedPropertyChanged("FileList");
        }
    }
}

RaisedPropertyChanged

public event PropertyChangedEventHandler PropertyChanged;

protected void RaisedPropertyChanged(string propertyName)
{
    PropertyChangedEventHandler handler = this.PropertyChanged;
    if (handler != null)
    {
        PropertyChangedEventArgs args = new PropertyChangedEventArgs(propertyName);
        handler(this, args);
    }
}


**XAML:**
<Window.Resources>
    <uc:ucNav x:Key="Nav"/>        
    <uc:FileExplorerViewModel x:Key="viewModel"/>
    <local:FileImageConverter x:Key="ImageConverter"/>
</Window.Resources>

 <ListView Width="580" Margin="205,32,9,10" x:Name="File_List" ItemsSource="{Binding Path=FileList}">
    <ListView.View>
        <GridView>
            <GridViewColumn Width="150" Header="Name" >
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <StackPanel>
                            <Image Source="{Binding Converter={StaticResource ImageConverter}}" Height="20" Width="20" Stretch="Fill"/>
                            <TextBlock x:Name="file_Name" Text="{Binding FileName}"/>
                        </StackPanel>
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>
            <GridViewColumn Width="150">
                <GridViewColumnHeader>
                    <TextBlock Text="Date Modified" />
                </GridViewColumnHeader>
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock x:Name="Date_Modified"  Text="{Binding DateModified}"/>
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>
            <GridViewColumn Width="150">
                <GridViewColumnHeader>
                    <TextBlock Text="File Type" />
                </GridViewColumnHeader>
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock x:Name="File_Type" Text="{Binding FileType}"/>
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>
            <GridViewColumn Width="130">
                <GridViewColumnHeader>
                    <TextBlock Text="File Size" />
                </GridViewColumnHeader>
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock x:Name="File_Size" Text="{Binding FileSize}"/>
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>

        </GridView>
    </ListView.View>
</ListView>

聽起來您的DataContext設置不正確,因為您發布的其他代碼看起來正確。

在您的點擊處理程序中放置一個斷點,然后仔細檢查File_List.DataContext == _ViewModel

DataContext通常是從父控件繼承的,如果這是最頂部的窗口,則可以從后面的代碼中進行設置。 在極少數情況下,您也可以綁定或設置該值,但是通常不建議這樣做,因為這會導致混亂和調試麻煩。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM