0

私は地下鉄アプリの作業を開始したばかりで、ディスパッチャーが UI を更新しないという問題に直面しています。私のコードは以下のとおりです。何が問題だったのか教えてください。

public class Test : DependencyObject
{

    public static readonly DependencyProperty CurrentItemProperty =
       DependencyProperty.Register("NameOfPerson", typeof(string), typeof(Test), null);

    public String NameOfPerson
    {
        get
        {
            return (string)GetValue(CurrentItemProperty);
        }
        set
        {
            runmethod(value);
        }
    }

    public async void runmethod(String text)
    {
        await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
        {
            SetValue(CurrentItemProperty, text);
        }
        );
    }
}

メインページには、更新テキストボックスを起動するときにイベントボタンのクリックがあります。

private void Button_Click_2(object sender, RoutedEventArgs e)
    {
        Test t = new Test();
        t.NameOfPerson = "Hello Umar";
    }

MainPage.xaml は次のようになります

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

<Grid Background="{StaticResource ApplicationPageBackgroundThemeBrush}">
       <Button Content="Button" HorizontalAlignment="Left" Margin="207,187,0,0"   VerticalAlignment="Top" Height="80" Width="255" Click="Button_Click_2"/>
       <TextBox x:Name="textB" Text="{Binding NameOfPerson}" HorizontalAlignment="Left" Height="80" Margin="730,187,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="307"/>

    </Grid>
</Page>
4

1 に答える 1

0

あなたがしようとしているのは、ボタンでテキストを更新することである場合は、MVVM パターンを調べて、Binding で UI を更新する必要があります。

これを行うには、オブジェクトを作成する必要があります。この場合は、人物としましょう。

public class Person
{
    public string Name { get; set; }
}

次に、ボタンを使用して更新するビューモデル内に人物を配置する必要があります。ビューモデルは、基本ページなどを使用する場合、Windows ストア アプリケーションの一部である BindableBase から派生します。ビューモデルは次のようになります。

public class MainPageViewModel : BindableBase
{
    public MainPageViewModel()
    {

    }

    private Person person;
    public Person Person
    {
        get { return person; }
        set { SetProperty(ref person, value); }
    }

    public void LoadData()
    {
        Person = new Person() { Name = "Simple name" };
    }

    public void UpdatePerson()
    {
        Person.Name = "Updated Name";
        OnPropertyChanged("Person");
    }
}

bindableBase がない場合は、次のようになります。

    [Windows.Foundation.Metadata.WebHostHidden]
public abstract class BindableBase : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected bool SetProperty<T>(ref T storage, T value, [CallerMemberName] String propertyName = null)
    {
        if (object.Equals(storage, value)) return false;

        storage = value;
        this.OnPropertyChanged(propertyName);
        return true;
    }

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

MainPage で ViewModel を作成し、ページに DataContext を設定します。また、Viewmodel 内でオブジェクトを処理する必要があるため、Person オブジェクトを変更するボタンをクリックしたときに update メソッドを作成します。

public sealed partial class MainPage : Page
{
    private readonly MainPageViewModel viewModel;

    public MainPage()
    {
        this.InitializeComponent();
        viewModel = new MainPageViewModel();
        viewModel.LoadData();
        this.DataContext = viewModel;   
    }

    private void Button_Tapped(object sender, TappedRoutedEventArgs e)
    {
        viewModel.UpdatePerson();
    }
}

最後に、Viewmodel 内の Person の name プロパティを指す UI の TextBox:

  <TextBox
        x:Name="textB"
        Text="{Binding Person.Name}"
        HorizontalAlignment="Left"
        Height="80"
        Margin="730,187,0,0"
        TextWrapping="Wrap"
        VerticalAlignment="Top"
        Width="307" />

ボタンで UI を更新する方法についての質問がこれで解決されることを願っています。

于 2013-04-24T14:24:39.703 に答える