gpt4 book ai didi

c# - 文本 block 绑定(bind)不会在运行时更新

转载 作者:行者123 更新时间:2023-11-30 23:24:15 24 4
gpt4 key购买 nike

我是 c# UWP 开发的新手,我试图在运行时更改 TextBlock 的值,但绑定(bind)无法正常工作。

我使用 INotifyPropertyChanged 将 XAML 中 TextBlock 的文本属性绑定(bind)到 ViewModel 上的属性,并且该值每 10 秒更改一次。

我不知道这样做是否正确,有人可以帮助我吗?

提前致谢!

this is the ViewModel code

class MainPaigeViewModel : INotifyPropertyChanged
{

public MainPaigeViewModel()
{
Task.Run(async () =>
{
Random random = new Random();
while (true)
{
await Task.Delay(10000);
int newValue = random.Next(-40, 40);
_MyValue = newValue.ToString();
Debug.WriteLine(MyValue);
}
});
}

//Properties
private string _MyValue;
public string MyValue
{
get { return _MyValue; }
set
{
_MyValue = value;
RaisePropertyChanged("MyValue");
}
}


//INotifyPropertyChanged
public event PropertyChangedEventHandler PropertyChanged;
protected void RaisePropertyChanged(string name)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}
}

and the XAML code

   <Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:CountDown2"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:ViewModels="using:CountDown2.ViewModels"
x:Class="CountDown2.MainPage"
mc:Ignorable="d">

<Page.DataContext>
<ViewModels:MainPaigeViewModel/>
</Page.DataContext>

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<RelativePanel VerticalAlignment="Center" HorizontalAlignment="Center">
<TextBlock Text="{Binding MyValue, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"
Width="100"
Height="40"
TextAlignment="Center"
FontSize="20"
/>
</RelativePanel>
</Grid>
</Page>

最佳答案

在 UWP 中,与 silver light 和 WPF 不同,出于性能原因,默认绑定(bind)是一次。绑定(bind)只在应用程序启动时发生一次。一种绑定(bind)方式是 WinRT、Silverlight 和 wpf 的默认绑定(bind)方式。这意味着 View 将被更新,但更新 View 不​​会更新 View 模型。双向绑定(bind)将同时更新 View 和 View 模型。

所以对于 <TextBlock>例子中推荐使用One Way绑定(bind)。

<TextBox> 中建议使用Two Way绑定(bind)用户输入。

我发现了一些导致绑定(bind)失败的小错误...所以我更改了 View 模型...使用的是私有(private)属性而不是公共(public)属性。由于代码在线程中更新值,然后尝试跨线程编码对象,因此添加了一个调度程序。还为所有 View 模型添加了一个公共(public)基类。这使属性绑定(bind)更容易一些,它在重构属性名称时停止了绑定(bind)问题。

Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync

public class MainPaigeViewModel: ViewModelBase

{


public MainPaigeViewModel()
{
Task.Run(async () =>
{
Random random = new Random();
while (true)
{
await Task.Delay(1000);
int newValue = random.Next(-40, 40);
try
{
await Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,
() => {
MyValue = newValue.ToString();
});

}
catch (Exception ex)
{
string s = ex.ToString();
}
Debug.WriteLine(MyValue);
}
});
}

//Properties
private string _MyValue;
public string MyValue
{
get { return _MyValue; }
set
{
_MyValue = value;
OnPropertyChanged();
}
}


}



public abstract class ViewModelBase : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged = delegate { };


protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{

if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}

我还更改了 View 以使用 x:binding。我喜欢 x:binding 而不是旧的数据绑定(bind),因为它在编译时而不是在运行时显示绑定(bind)问题。这是除了它提供的性能增强之外。

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<RelativePanel VerticalAlignment="Center" HorizontalAlignment="Center">
<TextBlock Text="{x:Bind viewModel.MyValue, Mode=OneWay}"
Width="100"
Height="40"
TextAlignment="Center"
FontSize="20"
/>
</RelativePanel>
</Grid>

x:bind 代码后面的页面

public sealed partial class MainPage : Page
{
public MainPaigeViewModel viewModel;

public MainPage()
{
this.InitializeComponent();

viewModel = new MainPaigeViewModel();
}


}

关于c# - 文本 block 绑定(bind)不会在运行时更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37881126/

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