简体   繁体   English

如何更新ListBoxItem属性

[英]How to update ListBoxItem property

I want to update DownloadingSpeed Property which is binded to TextBox in a ListBoxItem. 我想更新绑定到ListBoxItem中的TextBox的DownloadingSpeed属性。 I am generating ListBoxItems in c#. 我在c#中生成ListBoxItems。 Please guide me how do i update Binding Content of TextBoxes within a ListItemBox in C#. 请指导我如何在C#中更新ListItemBox中的TextBox的绑定内容。

WPF LisBox Code WPF LisBox代码

 <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 在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 在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. 如果您通过定义属性并正确声明XAML来正确使用WPF,则可能会发现您的代码有效。 It is customary to have an ObservableCollection<T> property that you data bind to the UI collection control. 通常,有一个ObservableCollection<T>属性,您可以将其数据绑定到UI集合控件。 You would then data bind it to the ItemsSource property of the control: 然后,您将数据绑定到控件的ItemsSource属性:

<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";

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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