WPF: TextBox绑定到"还有setter调用
本文关键字:还有 setter 调用 quot TextBox 绑定 WPF | 更新日期: 2023-09-27 18:07:28
我有一个简单的WPF应用。在后面的代码中,我有一个像这样的InputFile属性。
public string InputFile
{
get
{
return _inputFile;
}
set
{
_inputFile = value;
OnPropertyChanged("InputFile");
}
}
在XAML中,我有一个这样的StackPanel:
<StackPanel Orientation="Horizontal" DataContext="{Binding Path=InputFile}">
<StackPanel.CommandBindings>
<CommandBinding Command="Open"
CanExecute="OpenCanExecute"
Executed="OpenExecuted" />
<CommandBinding Command="Select"
CanExecute="SelectCanExecute"
Executed="SelectExecuted" />
</StackPanel.CommandBindings>
<TextBox Text="{Binding Path=.}"></TextBox>
<Button Command="Select">...</Button>
<Button Command="Open">-></Button>
</StackPanel>
我需要保持stackpanel数据上下文链接到InputFile,以允许命令函数访问它。
问题:当InputFile更改时,文本框更新,但如果我在文本框中键入新值,属性InputFile未更新(未调用setter方法)。任何想法?
您可以尝试以下操作:
<TextBox Text="{Binding Path=., UpdateSourceTrigger=PropertyChanged}"></TextBox>
如果您的命令是这样设置DataContext
的主要原因,那么这个解决方案如何呢?
<StackPanel Orientation="Horizontal">
<StackPanel.CommandBindings>
<CommandBinding Command="Open"
CanExecute="OpenCanExecute"
Executed="OpenExecuted" />
<CommandBinding Command="Select"
CanExecute="SelectCanExecute"
Executed="SelectExecuted" />
</StackPanel.CommandBindings>
<TextBox Text="{Binding InputFile}"></TextBox>
<Button Command="Select" CommandParameter="{Binding InputFile}">...</Button>
<Button Command="Open" CommandParameter="{Binding InputFile}">-></Button>
</StackPanel>
如果所有这些都失败了,这应该总是有效的。这是一个令人讨厌的解决方案,但它应该可以完成工作:
<Grid x:Name="myGrid">
StackPanel Orientation="Horizontal" DataContext="{Binding Path=InputFile}">
<StackPanel.CommandBindings>
<CommandBinding Command="Open"
CanExecute="OpenCanExecute"
Executed="OpenExecuted" />
<CommandBinding Command="Select"
CanExecute="SelectCanExecute"
Executed="SelectExecuted" />
</StackPanel.CommandBindings>
<TextBox Text="{Binding ElementName=myGrid, Path=DataContext.InputFile}"></TextBox>
<Button Command="Select">...</Button>
<Button Command="Open">-></Button>
</StackPanel>
</Grid>
就像Tomtom已经写过的,您可能需要UpdateSourceTrigger
。
在绑定中,您可以将模式指定为双向模式。当文本框的值从UI改变时,它将调用setter。
<TextBox Text="{Binding Path=., Mode=TwoWay}"/>
可以直接绑定到TextBox。什么是点绑定到StackPanel如果InputFile是字符串?
<StackPanel Orientation="Horizontal">
<TextBox Text="{Binding InputFile}"></TextBox>
</StackPanel>
编辑:您可以使用FindAncestor:
绑定命令Command="{Binding RelativeSource={RelativeSource FindAncestor,
AncestorType={x:Type Window}}, Path=DataContext.Select}"
或者您可以创建类似于下面的自定义类型:
public class InputFileViewModel
{
string File {get; set;}
ICommant Select {get; set;}
}
然后在TextBox中绑定到File属性