0

TextBlock/TextBoxのバインドに問題があります。TextBlockは、プロパティのコンテンツを表示しません。アプリをデバッグしているとき、プロパティにはコンテンツがあります。どうすればいいですか?Xaml。

<TextBlock HorizontalAlignment="Left" Margin="730,191,0,0" TextWrapping="Wrap" Text="{Binding XmlContentFile, Mode=TwoWay}"   VerticalAlignment="Top" Height="429" Width="465"/>

Webで簡単なコードを見つけていましたが、コードが見つかりませんでした。

コードプロパティ

 public string XmlContentFile
        {
            get
            {
                return this.xmlContentFile;
            }
            set
            {
                this.xmlContentFile = value;

            }
        }

私のDataContext

DataContext="{Binding Main, Source={StaticResource Locator}}">

XMLファイルを文字列変数にロードするメソッド

public async void  XmlContentLoad()
        {

            if (selectFile != null)
            {
                try
                {

                    StorageFolder storageFolder = ApplicationData.Current.LocalFolder;
                    StorageFile storageFile = await storageFolder.GetFileAsync(selectFile);
                    xmlFileTextContent = await FileIO.ReadTextAsync(storageFile);



                }
                catch (Exception)
                {
                    throw new Exception("Bug");
                }
            }
        }
4

2 に答える 2

1

問題は、XmlContentFileプロパティが変更されても通知を生成しないことです。ViewModelは、INotifyPropertyChangedを実装し、プロパティが変更されるたびにイベントを発生させる必要があります。

XmlContentLoadが完了する前に、ビューとそのデータバインディングがセットアップされ、実行されている可能性があります(非同期です)。データがロードされる前にバインディングがすでに完了している場合、バインディングが再度発生する唯一の方法は、プロパティが変更されたという通知を生成する場合です。

XmlContentLoadメソッドでは、パブリックプロパティではなくプライベート変数を設定していることも指摘しておく価値があります。

xmlFileTextContent = await FileIO.ReadTextAsync(storageFile);

通知を発生させるためにセッターコードが配線されている場合でも、プライベート変数を設定してもプロパティ変更通知が発生することはありません。XmlContentLoadを変更してプロパティを設定し、セッターにOnPropertyChanged通知を表示するか(推奨)、プライベート変数を設定した後にOnPropertyChangedを呼び出す必要があります(非推奨)。

お役に立てば幸いです。

開発サポート、設計サポート、そして途中でのより素晴らしい良さ:http: //bit.ly/winappsupport

于 2013-02-18T20:02:11.193 に答える
0

バインディングソースを正しく設定していることを確認してください。

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:WpfApplication1="clr-namespace:WpfApplication1"
    Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded_1" >
<Grid>
    <TextBlock Text="{Binding XmlContentFile, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Background="#FFF3A3A3"/>
</Grid>

また、プロパティの値を適切な場所に設定していることを確認してください。

public partial class MainWindow : Window,INotifyPropertyChanged
{
    private string _xmlContentFile;
    public string XmlContentFile
    {
        get
        {
            return _xmlContentFile ;
        }
        set 
        { 
            _xmlContentFile = value;
            OnPropertyChanged("XmlContentFile");
        }
    }
    public MainWindow()
    {
        InitializeComponent();
    }


    private void Window_Loaded_1(object sender, RoutedEventArgs e)
    {
        XmlContentFile = "New Value !";
    }

    public event PropertyChangedEventHandler PropertyChanged;

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

この答えはMVVMにはありませんが、DataContextをViewModelに設定する必要があることを除いて、それほど変更する必要はありません。

于 2013-02-16T15:30:47.487 に答える