1

VS2012とWindows8SDKを使用してMetroアプリを構築しています。アプリには、このクラスがあります(対応する構造体を使用)

// Parameter data structure for tools
public struct ToolParameter
{
    public string Title { get; set; }
    public Object Value { get; set; }
    public string Description { get; set; }
}
// Tool that will be used to execute something on phone
public class Tool
{
    public string Title{ get; set; }
    public ObservableCollection<ToolParameter> Parameters { get; set; }
    public string Description { get; set; }
}

アプリの特定のページで、クラスのインスタンスをページのdataContextにバインドします

this.DataContext = currentTool;

ページには、ページ上で編集できるようにしたいパラメーターなど、アプリに関するさまざまな情報を表示します。このため、TextBoxを使用してパラメーターを表示し、編集できるようにして、ToolParameter構造体の「Value」メンバーにバインドしています。

<TextBox x:Name="ParameterValue" FontSize="15" Text="{Binding Value, Mode=TwoWay}"     TextWrapping="Wrap"/>

残念ながら、TextBoxが値にバインドされると、フォーカスがなくなるまで更新されないため、ユーザーがクリックしてパラメーターを更新する(およびTextBoxからフォーカスを変更する)ボタンを追加しました。残念ながら、ボタンをクリックすると、フォーカスは変更されますが、currentTool変数のパラメーターの値は変更されません。私が見逃しているデータバインディングについて何かありますか?ParameterValueという名前のTextBoxの親(パラメーターはすべてListViewの一部です)も双方向である必要があるのではないでしょうか。

4

2 に答える 2

1

私が見ることができることから、あなたの TextBox は、クラスValueのプロパティであるにバインドされています。ToolParameterページの DataContext の型はToolです。ツールにParametersは、ToolParameter オブジェクトのコレクションが含まれています。そのため、TextBox は、Parameters プロパティにバインドするように設定された ItemsSource を持つ ItemsCollection 内にある必要があります。

例:

<StackPanel>
    <TextBlock Text="{Binding Title}"/>
    <TextBlock Text="{Binding Description}"/>

    <!-- showing a ListBox, but can be any ItemsControl -->
    <ListBox ItemsSource="{Binding Parameters}">
        <ListBox.ItemTemplate>
            <DataTemplate>
                <TextBox Text="{Binding Value}"/>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</StackPanel>

また、クラスが INotifyPropertyChanged を実装し、プロパティのセッターが PropertyChanged イベントを発生さToolせることを確認してください。ToolParameter

更新:コメントには大きすぎる情報を追加する

これは、バインディングのソース/ターゲットを理解するのに役立ちます。TextBox の場合、バインディングのソースは Value プロパティであり、Target は TextBox の TextProperty です。ソースが更新されると、TextBox 内の Text が更新されます。TextBox の TextProperty が変更されると、オブジェクトの Value プロパティが更新されます (モードが TwoWay に設定されている場合)。ただし、ツールは更新されず、Tool クラスの Parameters プロパティも更新されません。ToolParameter のプロパティが更新されたときにツール オブジェクトを更新する場合は、Parameters コレクションに追加される各 ToolParameter オブジェクトの PropertyChanged イベントをサブスクライブする必要があります。

于 2012-07-27T13:22:09.083 に答える
0

StackOverflow へようこそ!

バインディングでは、UpdateSourceTrigger を「PropertyChanged」に指定できます。

<TextBox Text="{Binding Value, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />

発生しているデフォルト値は「LostFocus」です。

于 2012-07-26T18:50:33.073 に答える