gpt4 book ai didi

C# WPF。多线程时绑定(bind)属性更改但 UI 不更新

转载 作者:太空宇宙 更新时间:2023-11-03 16:09:55 25 4
gpt4 key购买 nike

我有一个项目,我在代码隐藏中使用 get/set 绑定(bind) TextBlock 的 Text 属性。但是,当应用程序加载时,更改绑定(bind)属性无法更新用户界面。

主窗口.xaml:

<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<ListBox SelectionMode="Multiple" x:Name="lstFileManager" HorizontalContentAlignment="Stretch" Background ="Transparent" ItemsSource="{Binding}" ScrollViewer.HorizontalScrollBarVisibility="Disabled">
<ListBox.ItemTemplate>
<DataTemplate>
<Grid Visibility="{Binding ui_visiable}" Margin="5,0,0,0">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="{Binding ui_complete_percentage}"/>
<ColumnDefinition Width="{Binding ui_incomplete_percentage}"/>
</Grid.ColumnDefinitions>
<Rectangle Opacity="0.8" Grid.RowSpan="2" Grid.Column="0" Fill="{Binding ui_complete_color}" />
<Rectangle Opacity="0.8" Grid.RowSpan="2" Grid.Column="1" Fill="{Binding ui_incomplete_color}"/>
<TextBlock Margin="20,10,20,10" Text="{Binding ui_tip_text}" Grid.ColumnSpan="2" TextWrapping="Wrap" VerticalAlignment="Top" HorizontalAlignment="Left" MinHeight="20" FontSize="12" FontFamily="Microsoft YaHei"/>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="HorizontalAlignment" Value="Stretch"/>
<Setter Property="Margin" Value="0,0,0,1"/>
</Style>
</ListBox.ItemContainerStyle>
</ListBox>
</Grid>
</Window>

主窗口.xaml.cs:

using System;
using System.Collections.ObjectModel;
using System.Threading;
using System.Windows;
using System.Windows.Threading;

namespace WpfApplication1 {
/// <summary>
/// MainWindow.xaml
/// </summary>
public partial class MainWindow : Window {

public MainWindow() {
InitializeComponent();
Bind();
RefreshFileList();
}

#region DataBind
public class FileListViewItem {
public string ui_visiable { get; set; }
public string ui_complete_percentage { get; set; }
public string ui_incomplete_percentage { get; set; }
public string ui_complete_color { get; set; }
public string ui_incomplete_color { get; set; }
public string ui_tip_text { get; set; }
}
ObservableCollection<FileListViewItem> FileListViewItemGroup = new ObservableCollection<FileListViewItem>();
public void Bind() {
lstFileManager.ItemsSource = FileListViewItemGroup;
}
#endregion

#region Refresh File List
private void RefreshFileList() {
//new Thread((process) => {
Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, new Action(() => {
FileListViewItemGroup.Clear();
}));
for (int i = 0; i < 10; i++) {
FileListViewItem flvi = new FileListViewItem {
ui_tip_text = "1",
ui_visiable = "Visiable",
ui_complete_percentage = "0*",
ui_incomplete_percentage = "100*",
ui_complete_color = "White",
ui_incomplete_color = "#FFFF43FF"
};
Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, new Action(() => {
FileListViewItemGroup.Add(flvi);
}));
}
// those code below did not make sence when I am using mutli-threading.
FileListViewItemGroup[0].ui_complete_percentage = "100*";
FileListViewItemGroup[0].ui_incomplete_percentage = "0*";
FileListViewItemGroup[0].ui_tip_text = "what's wrong!";
//}).Start();
}
#endregion

}
}

问题是,当我尝试使用多线程时,那些代码 (FileListViewItemGroup[0].ui_complete_percentage = "100*";) 将不起作用。

我整晚都在研究它,但我不知道为什么。任何机构都可以修复代码或有一些解释来帮助我吗?谢谢。

最佳答案

(问题在评论和 OP 的问题编辑中解决。转换为社区 wiki 答案。参见 Question with no answers, but issue solved in the comments (or extended in chat))

OP 写道:

Problem solved, here is my code:

 #region DataBind
public class FileListViewItem : INotifyPropertyChanged
{
public string ui_visiable { get; set; }
public string ui_complete_percentage { get; set; }
public string ui_incomplete_percentage { get; set; }
public string ui_complete_color { get; set; }
public string ui_incomplete_color { get; set; }
private string _ui_tip_text;
public string ui_tip_text
{
get { return _ui_tip_text; }
set
{
_ui_tip_text = value;
RaisePropertyChanged("ui_tip_text");
}
}

#region Implement INotifyPropertyChanged
public event PropertyChangedEventHandler PropertyChanged;
public void RaisePropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
#endregion
}
ObservableCollection<FileListViewItem> FileListViewItemGroup = new ObservableCollection<FileListViewItem>();
public void Bind() {
lstFileManager.ItemsSource = FileListViewItemGroup;
}
#endregion

Thanks PoweredByOrange and Nick for their help :)

关于C# WPF。多线程时绑定(bind)属性更改但 UI 不更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17889617/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com