0

ViewModel 中的 WPF MVVM 我想访问 XAML 中的文本框绑定到的相同数据

MainWindow.xaml 上的 XAML 有一个绑定到 StoredProcs/ProcName 的文本框

<TextBox Name="txtProcName" Text="{Binding Path=StoredProcs/ProcName}"></TextBox>

和一个绑定到 StoredProcs 的 Grid 每当网格选择发生变化时,文本框中的绑定文本就会发生变化。

<DataGrid AutoGenerateColumns="False" 
    Height="300" Width="290"
    HorizontalAlignment="Center" 
    Name="dataGrid1" 
    VerticalAlignment="Top" 
    ItemsSource="{Binding StoredProcs}" 
    IsSynchronizedWithCurrentItem="True" 
    Margin="-6,0" Grid.RowSpan="2" Grid.Row="0">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Proc Name" Binding="{Binding ProcName}" >
        </DataGridTextColumn>
    </DataGrid.Columns>
</DataGrid>

我有一个按钮,单击时在 MainWindowViewModel 中执行一个过程,该按钮有效

<Button Content="Create RDL" Command="{Binding CreateStoredProcedure}" />

在 CreateStoredProcedure 代码中,我需要访问显示在文本框中的相同数据(不使用后面的代码)。我认为我需要获取 StoredProcs/ProcName 但无法弄清楚如何做到这一点。

我尝试将 CommandParameter 添加到 XAML,但不知道如何在 CreateStoredProcedure 指令中访问它,因为它不允许我添加参数

void CreateStoredProcedureExecute()
{
    string procName = "proc";
    //procName = { StoredProcs/ProcName };
    MessageBoxResult result = 
        MessageBox.Show(String.Format("Create Stored Procedure {0}", procName));
}

bool CanCreateStoredProcedure()
{
    return true;
}

public ICommand CreateStoredProcedure 
{ 
    get 
    { 
        return new RelayCommand(CreateStoredProcedureExecute, 
            CanCreateStoredProcedure); 
    } 
}
4

3 回答 3

1

除非我误解了您的问题,否则您应该能够从 CreateStoredProcedure 中获取 TextBox 绑定到的属性的值。

但有一件事,如果您希望 TextBox 更新属性,请确保将“Mode=TwoWay”添加到您的绑定表达式:

<TextBox Name="txtProcName" Text="{Binding Path=StoredProcs/ProcName, Mode=TwoWay}"></TextBox>
于 2012-06-15T17:42:39.973 回答
0

我认为 KDiTraglia 有正确的解决方案。我唯一会做的不同是将 绑定CommandParameter到模型,而不是 UI 元素。

<Button 
     Content="Create RDL"
     Command="{Binding CreateStoredProcedure}" 
     CommandParameter="{Binding Path=StoredProcs/ProcName}" />

我假设这StoredProcs/ProcName是一个真实有效绑定路径的占位符。

在这里获取更多信息:http: //msdn.microsoft.com/en-us/library/ms752308

于 2012-06-15T19:06:23.210 回答
0

除非我误解了,否则我认为你想要这样的东西?

<Button 
  Content="Create RDL" 
  Command="{Binding CreateStoredProcedure}" 
  CommandParameter="{Binding ElementName=txtProcName, Path=Text}"/>

但是,正如其他答案所述,您应该能够仅访问从命令支持文本框的 ViewModel 中的属性,但是如果由于某种原因您不能,我的代码也应该可以正常工作。

(假设您正在定义MSDN 文章定义的 RelayCommand,这应该可以解决您的其他问题)

public ICommand CreateStoredProcedure 
{ 
    get 
    { 
        return new RelayCommand<object>(
            (object parameter) => CreateStoredProcedureExecute(parameter), 
            (object parameter) => CanCreateStoredProcedure); 
    } 
}


private void CreateStoredProcedureExecute(object parameter)
{
    string ProcName = parameter as string;
}

我承认我在设置这样的命令方面有点缺乏经验,但我确实在我的代码中找到了一个工作示例,因此希望它有所帮助。

于 2012-06-15T17:46:06.943 回答