1

我有一个简单的 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 更改时,TextBox 会更新,但如果我在 Textbox 中键入新值,则属性 InputFile 不会更新(不调用 setter 方法)。任何的想法?

4

4 回答 4

1

您可以尝试以下方法:

<TextBox Text="{Binding Path=., UpdateSourceTrigger=PropertyChanged}"></TextBox>
于 2013-04-04T13:22:07.983 回答
0

您可以直接绑定到 TextBox。如果 InputFile 是字符串,那么绑定到 StackPanel 有什么意义?

<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 属性。

于 2013-04-04T14:32:12.803 回答
0

如果您的命令是拥有这样的集合的主要原因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.

于 2013-04-04T14:43:19.860 回答
0

在您的绑定中,您可以将模式指定为两种方式。当文本框值从 UI 更改时,这将调用您的 setter。

<TextBox Text="{Binding Path=., Mode=TwoWay}"/>
于 2013-04-04T15:01:40.417 回答