【问题标题】:show/hide control textbox based on combobox selected WPF根据选择的 WPF 组合框显示/隐藏控件文本框
【发布时间】:2015-08-10 18:57:49
【问题描述】:

我在 C#/FrameWork 4.0 中有一个 WPF/MVVM 项目

在我看来,我有两个 ControlBox“NoRSAC”和“LieuRSAC”

<View:StateControlTextBox
                            x:Name="NoRSAC"
                            ReadOnly="{Binding IsReadOnly}"
                            ViewModelDataType="UtilisateurSaisieViewModel" 
                            TableDataType="TUtilisateurDataTable"
                            Tag="{DynamicResource TELEPHONE}" 
                            Text="{Binding UserVM.No_RSAC, Mode=TwoWay}" Margin="0" Canvas.Top="140" Width="185" VerticalAlignment="Stretch" />
                        <View:StateControlTextBox
                            x:Name="LieuRSAC"
                            ReadOnly="{Binding IsReadOnly}"
                            ViewModelDataType="UtilisateurSaisieViewModel" 
                            TableDataType="TUtilisateurDataTable"
                            Tag="{DynamicResource TELEPHONE}" 
                            Text="{Binding UserVM.Lieu_RSAC, Mode=TwoWay}" Margin="0" Canvas.Top="140" Width="185" VerticalAlignment="Stretch"/>
                    </Canvas>

和 ControlComboBox "cmbFonction"

<View:StateControlComboBox
                            x:Name="cmbFonction"
                            ReadOnlyControlState="Disabled" 
                            IsReadOnly="{Binding IsReadOnly}"
                            ViewModelDataType="UtilisateurSaisieViewModel" 
                            TableDataType="TUtilisateurDataTable"
                            ItemsSource="{Binding ListeFonctions}" 
                            SelectedValue="{Binding UserVM.Fonction, Mode=TwoWay}" Width="303" Margin="0" HorizontalAlignment="Left" Canvas.Left="97" Canvas.Top="108" />

当我在 ComboBox "cmbFonction" 中选择一个特定值时,我想查看 ControlBox "NoRSAC" 和 "LieuRSAC" 并在它是另一个选定值时隐藏

感谢您的帮助

【问题讨论】:

    标签: c# wpf mvvm combobox textbox


    【解决方案1】:

    在属性Fonction 的set 方法中,您可以检查值并更新应该在视图模型中引入的另一个属性System.Windows.Visibility。在以下示例中,我将此属性称为TextBoxVisibility

    public class UserVM : INotifyPropertyChanged
    {
        private Visibility _textBoxVisibility;
    
        public Visibility TextBoxVisibility
        {
            get { return _textBoxVisibility; }
            set 
            {
                _textBoxVisibility = value;
                OnPropertyChanged();
            }
        }
    
        public string Fonction
        {
            get { return _fonction; }
            set
            {
                _fonction = value;
                OnPropertyChanged();
                if (value == "Value A")
                    TextBoxVisibility = Visibility.Hidden;
                else
                    TextBoxVisibility = Visibility.Visible;
            }
        }
    
        // Other members omitted for sake of simplicity.
    }
    

    请注意,您需要(直接或间接)实现 INotifyPropertyChanged,以便将属性值的更改转发到绑定,这些绑定又可以更新您视图中控件的依赖属性。

    因此,您一定不要忘记为视图中的所有文本框添加额外的绑定。这是一个例子,重要的部分是Visibility上的绑定:

    <View:StateControlTextBox
                            x:Name="NoRSAC"
                            ReadOnly="{Binding IsReadOnly}"
                            ViewModelDataType="UtilisateurSaisieViewModel" 
                            TableDataType="TUtilisateurDataTable"
                            Tag="{DynamicResource TELEPHONE}"
                            Visibility="{Binding UserVM.TextBoxVisibility}" 
                            Text="{Binding UserVM.No_RSAC, Mode=TwoWay}" Margin="0" Canvas.Top="140" Width="185" VerticalAlignment="Stretch" />
    

    【讨论】:

    • 谢谢,再次感谢最后一个问题:我创建了 UserVM 类?我必须把它放在哪里?在模型或视图模型中?
    • 不在您的 ComboBox(或其他控件)上,仅在您的文本框上。当用户在组合框中选择另一个项目时,它会通过绑定SelectedValue="{Binding UserVM.Fonction, Mode=TwoWay}" 传播到您的视图模型。这仅意味着调用了 UserVM.Fonction 的 set 方法。
    • UserVM 是您的视图模型类。由于您没有发布视图模型的代码,我只是猜想是这样调用的。您必须将TextBoxVisibility 属性添加到包含Fonction 的同一视图模型类中。
    • 答案左侧应该有一个复选标记,就在投票向上/向下箭头的正下方。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多