web-dev-qa-db-ja.com

新しいキャラクターごとにWPF TextBoxバインディングを起動しますか?

新しい文字がTextBoxに入力されたらすぐにデータバインディングを更新するにはどうすればよいですか?

私はWPFのバインディングについて学んでいますが、今では(できれば)単純な問題にとらわれています。

Pathプロパティを設定できる単純なFileListerクラスがあり、FileNamesプロパティにアクセスするとファイルのリストが表示されます。そのクラスは次のとおりです。

class FileLister:INotifyPropertyChanged {
    private string _path = "";

    public string Path {
        get {
            return _path;
        }
        set {
            if (_path.Equals(value)) return;
            _path = value;
            OnPropertyChanged("Path");
            OnPropertyChanged("FileNames");
        }
    }

    public List<String> FileNames {
        get {
            return getListing(Path);
        }
    }

    private List<string> getListing(string path) {
        DirectoryInfo dir = new DirectoryInfo(path);
        List<string> result = new List<string>();
        if (!dir.Exists) return result;
        foreach (FileInfo fi in dir.GetFiles()) {
            result.Add(fi.Name);
        }
        return result;
    }

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

この非常にシンプルなアプリで、FileListerをStaticResourceとして使用しています。

<Window x:Class="WpfTest4.MainWindow"
    xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WpfTest4"
    Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <local:FileLister x:Key="fileLister" Path="d:\temp" />
    </Window.Resources>
    <Grid>
        <TextBox Text="{Binding Source={StaticResource fileLister}, Path=Path, Mode=TwoWay}"
        Height="25" Margin="12,12,12,0" VerticalAlignment="Top" />
        <ListBox Margin="12,43,12,12" Name="listBox1" ItemsSource="{Binding Source={StaticResource ResourceKey=fileLister}, Path=FileNames}"/>
    </Grid>
</Window>

バインディングは機能しています。テキストボックスの値を変更してからその外側をクリックすると、リストボックスの内容が更新されます(パスが存在する限り)。

問題は、新しい文字が入力されるとすぐに更新したいということであり、テキストボックスがフォーカスを失うまで待たないことです。

どうやってやるの?これをxamlで直接行う方法はありますか、またはボックスでTextChangedまたはTextInputイベントを処理する必要がありますか?

69
luddet

テキストボックスのバインディングでは、設定する必要があるのはUpdateSourceTrigger=PropertyChanged

121
Dave

UpdateSourceTriggerプロパティをPropertyChangedに設定する必要があります

<TextBox Text="{Binding Source={StaticResource fileLister}, Path=Path, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
    Height="25" Margin="12,12,12,0" VerticalAlignment="Top" />
29
Eduardo Brites