使用样式使文本框只读

时间:2016-11-05 21:36:08

标签: c# wpf mvvm

我是一个C#/ WPF应用程序。在我的Mainwindow.xaml上,我以编程方式加载其他视图。 MainWindow.xaml上有一个checbox。当点击它时,我需要将屏幕上的所有文本框控件设置为只读。 该代码适用于Mainwindow上的控件,但不适用于AView.xaml上的文本框

我在这里想到的是什么?或者还有其他方法可以实现这个功能吗?

感谢。

这是我的代码:

MainWindow.xaml:

<CheckBox IsChecked="{Binding IsCheckboxChecked, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>

<ContentPresenter Content="{Binding CurrentViewModel}" >
                <ContentPresenter.Resources>
                    <DataTemplate DataType="{x:Type ViewModel:VModelA}"  >
                        <Views:AView/>
                    </DataTemplate>                    
            </ContentPresenter>

MainWindowResources.xaml:

<Style TargetType="TextBox" x:Key="ReadOnlyStyle">
        <Setter Property="IsReadOnly" Value="{Binding Path=IsCheckboxChecked}"/>        
    </Style>

<Style TargetType="TextBox" x:Key="ReadOnlyStyleChild">
        <Setter Property="IsReadOnly" Value="{Binding Path=IsCheckboxCheckedChild}"/>
    </Style>

MainWindowViewModel.cs

private static MainWindowViewModel _instance = new MainWindowViewModel();

public static MainWindowViewModel Instance
        {
            get {
                return _instance;
            }
        }

 public bool IsCheckboxChecked
        {
            get { 

                return m_isCheckboxChecked;
            }
            set
            {               
                m_isCheckboxChecked = value;
                OnPropertyChanged("IsCheckboxChecked");                
            }        
        }

VModelA.cs:

public bool IsCheckboxCheckedChild
            {
                get {
                    return MainWindowViewModel.Instance.IsCheckboxChecked;
                }

            }

AView.xaml

 <TextBox Style="{DynamicResource ReadOnlyStyleChild}">

1 个答案:

答案 0 :(得分:1)

如果您在调试应用程序时查看输出窗口,我怀疑您会看到有关绑定失败的消息:

{Binding Path=IsCheckboxChecked}

在样式中绑定是很棘手的。来源是什么?您可能需要指定ElementNameRelativeSource