2

我正在编写一个数据输入应用程序,并且在处理应用程序的添加、编辑和查看“模式”时遇到问题。

场景:用户从一个窗口中选择两个组合框中的项目,然后单击一个按钮。如果组合框选择与现有记录不匹配,则表单应打开并准备好插入值的新记录。如果选择与现有记录匹配,则应以“只读”模式打开该记录,并使用表单中的所有文本框。如果用户希望修改现有数据,他们单击表单的编辑按钮,将文本框设置为“可编辑”。

我是 wpf 的新手,但在我的 vba 应用程序中,我通常有一个 DataMode 属性和一个 ToggleControls 方法,该方法将循环通过 TabControl 的 TabItems,然后循环通过 TabItems 的控件,设置找到的任何 TextBox 控件的 IsReadOnly 属性基于“DataMode”属性。但是,我怀疑这是否是 wpf 中要遵循的路径。

所以,我的问题是,我是否使用上述方法?如果是这样,我如何访问 TabItem 中的控件。这不起作用:foreach (Control ctrl in MyTabCtrl) { //if Textbox do stuff }.

如果这不是这样做的方法,有人可以告诉我方法吗?我猜这要么是模板/样式问题,要么与以某种方式将数据设置为只读有关,然后将 TextBox 的 IsReadOnly 属性绑定到数据的状态。编辑:哦,或者那个 ViewStateManager 的东西。所有这些我都知之甚少。

4

2 回答 2

2

一个简单的方法是

在后面的代码中声明一个名为 DependencyPropertyIsReadOnly

public static readonly DependencyProperty IsReadOnlyProperty = DependencyProperty.Register(
            "IsReadOnly",
            typeof (bool),
            typeof (MainWindow)
            );

        public bool IsReadOnly
        {
            get { return (bool) GetValue(IsReadOnlyProperty); }
            set { SetValue(IsReadOnlyProperty, value); }
        }

实现 Buttons Click 事件,以便 IsReadOnly 获得falseClick

 private void Button_Click(object sender, RoutedEventArgs e)
    {
        IsReadOnly = false;
    }

使用将 TextBoxes 绑定到IsReadonly属性DataBinding

   <TextBox IsReadOnly="{Binding Path=IsReadOnly, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Window}, Mode=OneWay}" />

此绑定假定您背后的代码不是您的DataContext,因此您必须相对绑定到应用 CodeBehind 的 Window/UserControl。

这样,TextBoxes 就会监听这个属性的变化。当它切换时,它们会自动更改其 ReadOnly 状态。

于 2012-08-02T06:27:48.483 回答
-1

您可以使用 DataContext :

将 tabControl 的数据上下文绑定到您的记录(使用按钮事件单击编写 this.Canvas.DataContext = _yourRecord 示例)

public void bntEvent_Click(object sender, EventArgs e)
    {
        // Do matching and put the result in result field 
        MyTabCtrl.DataContext = false;
    }

在数据上下文上绑定文本框的 IsReadOnly/IsEnable 属性并使用转换器返回真/假值

    <TextBox IsReadOnly="{Binding .}" />

有关转换器的更多信息,请参阅http://msdn.microsoft.com/en-us/library/system.windows.data.ivalueconverter.aspx

我希望我能帮助你,你能理解我糟糕的英语。

再见

于 2012-08-02T06:48:21.340 回答