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方法)。任何想法?

WPF: TextBox绑定到"还有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属性