我正在使用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的一部分)也必须是双向的?
答案 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>
还要确保您的班级Tool
和ToolParameter
实施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”。