简体   繁体   中英

How to update ListBoxItem property

I want to update DownloadingSpeed Property which is binded to TextBox in a ListBoxItem. I am generating ListBoxItems in c#. Please guide me how do i update Binding Content of TextBoxes within a ListItemBox in C#.

WPF LisBox Code

 <ListBox Width="Auto" 
                 Name="WebsiteList"
                 MouseUp="SelectedListItem"
                 SelectedIndex="0"
                 Grid.Column="1" 
                 Grid.Row="2" 
                 Grid.RowSpan="2"
                 Margin="0,0,0,0">
            <ListBox.ItemTemplate>
            <DataTemplate>
                    <Grid Width="920">
                    <StackPanel Orientation="Vertical">
                            <StackPanel Orientation="Horizontal">
                                <Grid Width="920">
                                <TextBlock FontWeight="Bold" FontSize="18" Width="Auto">
                                <Hyperlink NavigateUri="http://google.com" FontStyle="Italic">
                                    <Label Content="{Binding WebsiteTitle}" /><Label FontSize="10" Margin="0,0,0,3" Content="{Binding DirectorySize}" />
                                </Hyperlink>
                                </TextBlock>

                                <TextBlock Width="0" TextAlignment="right">
                                    <TextBlock Visibility="Hidden" Text="{Binding DownloadID}"/>
                                    <TextBlock Visibility="Hidden" Text="{Binding DirectoryPath}"/>
                                    <TextBlock Visibility="Hidden" Text="{Binding CurrentTime}"/>
                                    <TextBlock Visibility="Hidden" Text="{Binding CurrentDate}"/>
                                    <TextBlock Visibility="Hidden" Text="{Binding GivenUrl}"/>
                                </TextBlock>
                                </Grid>

                            </StackPanel>

                        <StackPanel Orientation="Horizontal">
                                <Grid Width="920">
                                    <ProgressBar Name="progress1" Maximum="100" Minimum="0" Value="30" Background="#FFF" Width="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Grid}}, Path=Width}" Height="10" />
                                </Grid>
                        </StackPanel>
                        <StackPanel Orientation="Horizontal">
                                <Grid Width="920">
                            <TextBlock HorizontalAlignment="Left" Width="Auto">Status: <TextBlock Text="{Binding Status}"/></TextBlock>
                                    <TextBlock Width="Auto" TextAlignment="right">
                                    <TextBlock Text="Downloading Speed: "/> 
                                    <TextBlock Name="DownloadingSpeed" Text="{Binding DownloadingSpeed}"/>
                            </TextBlock>
                                </Grid>
                            </StackPanel>
                    </StackPanel>
                    </Grid>
                </DataTemplate>
            </ListBox.ItemTemplate>
         </ListBox> 

In MainWindow.xaml.cs

 private void GenerateList()
{
 List<Download> WebsitesList = new List<Download>();

 WebsitesList.Add(new Download() {DownloadID = ID, WebsiteTitle = WebTitle, Status = WebStatus, CurrentTime = CurrentTime,CurrentDate = CurrentDate, DownloadingSpeed = DownloadSpeed, DirectoryPath = path, DirectorySize = helper.GetDirectorySize(path),GivenUrl = url });

 WebsiteList.ItemsSource = WebsitesList;       
}
//get download speed and update DownloadingSpeed    
 private void updateDownloadingSpeed(object sender, EventArgs e)
    {

        interfaceStats = NetworkInterface.GetAllNetworkInterfaces()[0].GetIPv4Statistics();

        downloadspeed = (interfaceStats.BytesReceived - previousbytesreceived) / 1024;

        previousbytesreceived = NetworkInterface.GetAllNetworkInterfaces()[0].GetIPv4Statistics().BytesReceived;

        Download.DownloadingSpeed = Math.Round(downloadspeed, 2) + " KB/s"; //Rounding to 2 decimal places and save in DownloadSpeed Property
}

In Download.cs

 public class Download : INotifyPropertyChanged
    {
          private string _DownloadingSpeed = "0 kb/s";
        public string DownloadingSpeed
        {
            get { return _DownloadingSpeed; }
            set
            {
                if (_DownloadingSpeed == value)
                    return;

                _DownloadingSpeed = value;
                this.OnPropertyChanged("DownloadingSpeed");
            }
        }


        public event PropertyChangedEventHandler PropertyChanged;

        protected void OnPropertyChanged(string propertyName)
        {
            if (this.PropertyChanged != null)
                this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }

}

为TextBlock添加UpdateSourceTrigger。

<TextBlock Name="DownloadingSpeed" Text="{Binding DownloadingSpeed, UpdateSourceTrigger=PropertyChanged}"/>

You might find that your code works if you use WPF properly by defining properties and declaring XAML correctly. It is customary to have an ObservableCollection<T> property that you data bind to the UI collection control. You would then data bind it to the ItemsSource property of the control:

<ListBox ItemsSource="{Binding Items}" ... />

Then, when you want to update any properties of the items , you need to set the properties of the items . This:

Download.DownloadingSpeed = Math.Round(downloadspeed, 2) + " KB/s";

... is not setting the property of an item from the collection . To do that, you'd need to do something like this:

// Use whatever filter you want to find the correct item from the collection
Download downloadInstance = Items.Where(d => d.Name == "SomeName").First();
downloadInstance.DownloadingSpeed = Math.Round(downloadspeed, 2) + " KB/s";

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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