need my button disable when the textbox is Empty o

2019-06-14 14:22发布

问题:

Hai i have doing one simple app in Silverlight5 with MVVM pattern. In design page i have three textbox and one button. here my requirement is if the 3 textbox is empty or null means the button is going to be disabled. how to achieve this.. any help..? My Problem is:

1) It is worked for the 1st textbox. while i entered anything in the 1st textbox the button is in disabled mode. But if i moved to the 2nd TextBox means the button is enabled. 2) I need all the textbox will Validated after that only Button is enabled. If any one of the Textbox is Empty means the button is again went to disabled mode.. Any Help..? Here i have attached my coding.. Xaml:

<Button Content="Add"  Width="59" IsEnabled="{Binding ButtonIsEnabled}" Height="23" Margin="256,75,0,0" VerticalAlignment="Top" HorizontalAlignment="Left" TabIndex="4" >
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="Click">
                    <si:CallDataMethod Method="AddEmployee"/>
                    <si:SetProperty TargetName="LayoutRoot" PropertyName="Background" Value="LightBlue"/>
                </i:EventTrigger>
            </i:Interaction.Triggers>
        </Button>
        <TextBlock FontWeight="Bold" Height="26" HorizontalAlignment="Left" Margin="47,12,0,0" Name="textBlock1" Text="First Name:" VerticalAlignment="Top" Width="77" />
        <TextBox Height="23" HorizontalAlignment="Left" Margin="130,12,0,0" Name="textBox1" VerticalAlignment="Top" Width="120" Text="{Binding Fname,Mode=TwoWay}" TabIndex="1" AcceptsReturn="False">
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="TextChanged">
                    <si:CallDataMethod Method="ButtonIsEnabled"/>
                </i:EventTrigger>
            </i:Interaction.Triggers>
        </TextBox> 
        <TextBlock FontWeight="Bold" Height="25" HorizontalAlignment="Left" Margin="35,44,0,0" Name="textBlock2" Text="Second Name:" VerticalAlignment="Top" />
        <TextBox Height="23" HorizontalAlignment="Left" Margin="130,44,0,0" Name="textBox2" VerticalAlignment="Top" Width="120" Text="{Binding Sname,Mode=TwoWay}" TabIndex="2" >
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="TextChanged">
                    <si:CallDataMethod Method="ButtonIsEnabled"/>
                </i:EventTrigger>
            </i:Interaction.Triggers>
        </TextBox> 
        <TextBlock FontWeight="Bold" Height="23" HorizontalAlignment="Left" Margin="45,75,0,0" Name="textBlock3" Text="Department:" VerticalAlignment="Top" />
        <TextBox Height="23" HorizontalAlignment="Left" Margin="130,75,0,0" Name="textBox3" VerticalAlignment="Top" Width="120"  Text="{Binding Dept,Mode=TwoWay}" TabIndex="3" >
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="TextChanged">
                    <si:CallDataMethod Method="ButtonIsEnabled"/>
                </i:EventTrigger>
            </i:Interaction.Triggers>
        </TextBox> 

ViewModel Code:

EmployeeListViewModel.cs

public bool ButtonIsEnabled
        {
            get
            {
                return !(((string.IsNullOrEmpty(this.Fname)) && (string.IsNullOrEmpty(this.Sname)) && (string.IsNullOrEmpty(this.Dept))));
            }
        }
        private string _fname;
        public string Fname
        {
            get
            {
                return _fname;
            }
            set
            {
                if (_fname != value)
                {
                    _fname = value;
                    RaisePropertyChanged("Fname");
                    //RaisePropertyChanged("ButtonIsEnabled");
                }
                else
                {
                    _fname = value;
                    RaisePropertyChanged("Fname");
                }
            }
        }


private string _sname;
        public string Sname
        {
            get
            {
                return _sname;
            }
            set
            {
                if (_sname != value)
                {
                    _sname = value;
                    RaisePropertyChanged("Sname");
                    RaisePropertyChanged("ButtonIsEnabled");
                }
                else
                {
                    _sname = value;
                    RaisePropertyChanged("Sname");
                }
            }
        }
        private string _dept;
        public string Dept
        {
            get
            {
                return _dept;
            }
            set
            {
                if (_dept != value)
                {
                    _dept = value;
                    RaisePropertyChanged("Dept");
                    RaisePropertyChanged("ButtonIsEnabled");
                }
                else
                {
                    _dept = value;
                    RaisePropertyChanged("Dept");
                }
            }
        } 

回答1:

If you want the button to be enabled only when each textbox has text, you need to change your ButtonIsEnabled property like so:

public bool ButtonIsEnabled
{
    get
    {
        return !(((string.IsNullOrEmpty(this.Fname)) || (string.IsNullOrEmpty(this.Sname)) || (string.IsNullOrEmpty(this.Dept))));
    }
}


回答2:

you need to remove your triggers and use UpdateSourceTrigger in your bindings e.g.

Text="{Binding Fname,Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"

so your XAML will look something like:

<StackPanel>

    <Button Content="Add"  Width="59" IsEnabled="{Binding ButtonIsEnabled}" Height="23" Margin="256,75,0,0" VerticalAlignment="Top" HorizontalAlignment="Left" TabIndex="4" />

    <TextBlock FontWeight="Bold" Height="26" HorizontalAlignment="Left" Margin="47,12,0,0" Name="textBlock1" Text="First Name:" VerticalAlignment="Top" Width="77" />
    <TextBox Height="23" HorizontalAlignment="Left" Margin="130,12,0,0" Name="textBox1" VerticalAlignment="Top" Width="120" Text="{Binding Fname,Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" TabIndex="1" AcceptsReturn="False"/>

    <TextBlock FontWeight="Bold" Height="25" HorizontalAlignment="Left" Margin="35,44,0,0" Name="textBlock2" Text="Second Name:" VerticalAlignment="Top" />
    <TextBox Height="23" HorizontalAlignment="Left" Margin="130,44,0,0" Name="textBox2" VerticalAlignment="Top" Width="120" Text="{Binding Sname,Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" TabIndex="2" />

    <TextBlock FontWeight="Bold" Height="23" HorizontalAlignment="Left" Margin="45,75,0,0" Name="textBlock3" Text="Department:" VerticalAlignment="Top" />
    <TextBox Height="23" HorizontalAlignment="Left" Margin="130,75,0,0" Name="textBox3" VerticalAlignment="Top" Width="120"  Text="{Binding Dept,Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" TabIndex="3" />

</StackPanel>

and your VM class needs to look like:

    public bool ButtonIsEnabled
        {
        get
            {
            return !(string.IsNullOrEmpty(this.Fname) || string.IsNullOrEmpty(this.Sname) || string.IsNullOrEmpty(this.Dept));
            }
        }


    private string _fname;
    public string Fname
        {
        get { return _fname; }
        set
            {
            _fname = value;
            OnPropertyChanged("Fname");
            OnPropertyChanged("ButtonIsEnabled");  
            }
        }


    private string _sname;
    public string Sname
        {
        get { return _sname;}
        set
            {
            _sname = value;
            OnPropertyChanged("Sname");
            OnPropertyChanged("ButtonIsEnabled");          
            }
        }


    private string _dept;
    public string Dept
        {
        get { return _dept; }
        set
            {
            _dept = value;
            OnPropertyChanged("Dept");
            OnPropertyChanged("ButtonIsEnabled");
            }             
        }




    #region INotifyPropertyChanged Members

        public event PropertyChangedEventHandler PropertyChanged;
        protected void OnPropertyChanged(string propertyName)
            {
            if (PropertyChanged != null)
                {
                PropertyChanged(this,
                    new PropertyChangedEventArgs(propertyName));
                }
            }

    #endregion /****** InotifyPropertyChanged Members *********************/


回答3:

in wpf i would do the following, dunno if it works in silverlight

 public bool ButtonIsEnabled
 {
        get
        {
            return !string.IsNullOrEmpty(this.Fname) && !string.IsNullOrEmpty(this.Sname) && !string.IsNullOrEmpty(this.Dept);
        }
    }

    private string _fname;
    public string Fname
    {
        get
        {
            return _fname;
        }
        set
        {
            if (_fname != value)
            {
                _fname = value;
                RaisePropertyChanged("Fname");
                RaisePropertyChanged("ButtonIsEnabled");
            }
        }
    }

    private string _sname;
    public string Sname
    {
        get
        {
            return _sname;
        }
        set
        {
            if (_sname != value)
            {
                _sname = value;
                RaisePropertyChanged("Sname");
                RaisePropertyChanged("ButtonIsEnabled");
            }
        }
    }

    private string _dept;
    public string Dept
    {
        get
        {
            return _dept;
        }
        set
        {
            if (_dept != value)
            {
                _dept = value;
                RaisePropertyChanged("Dept");
                RaisePropertyChanged("ButtonIsEnabled");
            }
        }
    }