TwoWay绑定不更新目标 - Metro App

时间:2012-07-26 18:40:18

标签: c# xaml data-binding windows-8 windows-runtime

我正在使用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显示参数,以便对其进行编辑,并将其绑定到&#34; Value&#34; ToolParameter结构的成员。

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

不幸的是,当TextBox绑定到某个值时,它不会更新,直到它不再有焦点为止,所以我添加了一个按钮,用户可以单击该按钮来更新参数(并更改焦点从文本框)。不幸的是,在单击按钮时,虽然焦点发生了变化,但currentTool变量中的参数值永远不会改变。有什么关于我缺少的数据绑定吗?可能是名为ParameterValue的TextBox的父级(参数都是ListView的一部分)也必须是双向的?

2 个答案:

答案 0 :(得分:1)

从我所看到的,你是TextBox绑定到Value这是ToolParameter类的属性。该页面的DataContext类型为Tool。工具包含Parameters,它是ToolParameter对象的集合。因此,TextBox需要位于ItemsCollection中,ItemsCource设置为绑定到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,并且您的属性的setter会触发PropertyChanged事件

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

This应该有助于理解绑定中的Source / Target。对于TextBox,绑定的源是Value属性,Target是TextBox的TextProperty。当源更新时,Text将在TextBox中更新。如果TextBox的TextProperty发生更改,则它将更新对象的Value属性(提供的模式设置为TwoWay)。但是你的工具不会更新,Tool类的Parameters属性也不会更新。如果您希望在ToolParameter的属性更新时更新工具对象,则需要订阅添加到Parameters集合的每个ToolParameter对象的PropertyChanged事件。

答案 1 :(得分:0)

欢迎使用StackOverflow!

在绑定中,您可以将UpdateSourceTrigger指定为'PropertyChanged':

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

您遇到的默认值是“LostFocus”。