1

我正在使用 VS 2012 和 Windows 8 SDK 构建 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。Tool 包含Parameters的是 ToolParameter 对象的集合。因此,TextBox 需要位于 ItemsCollection 中,该 ItemsSource 设置为绑定到 Parameters 属性。

例子:

<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>

还要确保您的类ToolToolParameter实现 INotifyPropertyChanged 并且您的属性的设置器触发 PropertyChanged 事件

更新:添加对于评论来说太大的信息

应该有助于理解绑定中的源/目标。对于您的 TextBox,绑定的源是 Value 属性,而 Target 是 TextBox 的 TextProperty。当源更新时,文本将在 TextBox 内更新。如果您更改了 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 回答