簡體   English   中英

WPF CheckBox IsChecked屬性綁定問題

[英]WPF CheckBox IsChecked Property binding issues

請幫助,我正在嘗試做這個小例子。 我的目的是當我勾選該復選框時,應用程序應顯示我輸入的主機的IP地址。 但是復選框IsChecked屬性在視圖模型中永遠不會更新,即使在UI中也已更改

我的觀點

    Title="MainWindow" Height="350" Width="525">
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="*"/>
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>
    <Grid.Background>
        <LinearGradientBrush>
            <LinearGradientBrush.GradientStops>
                <GradientStop Offset="0.00" Color="LavenderBlush" />
            </LinearGradientBrush.GradientStops>
        </LinearGradientBrush>
    </Grid.Background>
    <StackPanel Grid.Row="0" Margin="150,30,69,236" Grid.ColumnSpan="2">
        <TextBox x:Name="inputBox" Text="{Binding TxtHostName, Mode=TwoWay}"  Foreground="Azure" Background="YellowGreen" VerticalAlignment="Bottom" Height="45"/>

    </StackPanel>
    <Button Command="{Binding StartCommand }" Content="Get IP" HorizontalAlignment="Left" Margin="257,89,0,0" VerticalAlignment="Top" Width="75" RenderTransformOrigin="0.013,-0.273"/>
    <TextBlock Text="{Binding IpAddress}" Background="BlueViolet" Margin="150,153,69,104" Grid.ColumnSpan="2"  />
    <Button Content="Close" Command="{Binding CloseCommand}" HorizontalAlignment="Left" Margin="257,250,0,0" VerticalAlignment="Top" Width="75"/>
    <CheckBox Content="CheckBox" IsChecked="{Binding IsSelected, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}" HorizontalAlignment="Left" Margin="150,111,0,0" VerticalAlignment="Top"/>
</Grid>

`

我的ViewModel:

public class ViewModel:INotifyPropertyChanged
{
    #region INPC
    public void RaisePropertyChanged(string propName)
    {
        if (this.PropertyChanged != null)
        {
            this.PropertyChanged(this, new PropertyChangedEventArgs(propName));
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;


    #endregion

    private string txtHostName;

    public string TxtHostName
    {
        get { return txtHostName; }
        set { txtHostName = value;
        RaisePropertyChanged("TxtHostName");
        }
    }

    private string ipAddress;

    public string IpAddress
    {
        get { return ipAddress; }
        set { ipAddress = value;
        RaisePropertyChanged("IpAddress");
        }
    }


    private bool checkbox;

    public bool CheckBox
    {
        get { return checkbox; }
        set { checkbox = value;
        RaisePropertyChanged("IsSelected");
        }
    }

    public event EventHandler RequestClose;

    protected void OnRequestClose()
    {
        if (RequestClose != null)
            RequestClose(this, EventArgs.Empty);
    }

    private RelayCommand _StartCommand;
    public ICommand StartCommand
    {
        get
        {
            if (this._StartCommand == null)
                this._StartCommand = new RelayCommand(StartClick);
            return this._StartCommand;
        }
    }

    private RelayCommand _CloseCommand;
    public ICommand CloseCommand
    {
        get
        {
            if(this._CloseCommand==null)
                this._CloseCommand=new RelayCommand(CloseClick);
            return this._CloseCommand;
        }
    }

    private void CloseClick(object obj)
    {
        OnRequestClose();
    }

    private void StartClick(object obj)
    {
        if (checkbox)
        {
            string HostName = TxtHostName;
            IPAddress[] ipaddress = Dns.GetHostAddresses(HostName);

            foreach (IPAddress ipaddr in ipaddress)
            {
                IpAddress = ipaddr.ToString();
            }

        }

        else
        {
            IpAddress = "Please tick the checkbox";
        }
    }
}

}

RealyCommand是應該的。 CheckBox屬性值永遠不會改變天氣,無論是否在用戶界面中更改它。

我不確定是否存在復制和粘貼錯誤,但是在使用標簽IsSelected引發屬性更改事件時,您的View Model屬性稱為Checkbox

這和綁定中的錯誤可能是您的問題。 根據您的視圖模型,綁定應為:-

    <CheckBox Content="CheckBox" IsChecked="{Binding Checkbox, Mode=TwoWay}" HorizontalAlignment="Left" Margin="150,111,0,0" VerticalAlignment="Top"/>

更新:建議使用C#5.0或更高版本

為了避免在創建setter和引發IPropertyNotifyChange事件時出現錯字,我建議如下使用CallerMemberName屬性:

  public void RaisePropertyChanged([CallerMemberName] string propName = "")
  {
      if (this.PropertyChanged != null)
      {
          this.PropertyChanged(this, new PropertyChangedEventArgs(propName));
      }
  }

然后您的示例中的二傳手將變為:-

  private bool checkbox;

  public bool CheckBox
  {
      get { return checkbox; }
      set { checkbox = value;
      RaisePropertyChanged();
    }
  }

意味着在重構視圖模型時,編譯器將插入調用屬性的名稱,以確保INotifyProertyChanged事件中的標簽與您的屬性名稱匹配,而無需記住您要手動對其進行更新。

您針對IsSelected引發了屬性更改事件,但可綁定的屬性稱為Checkbox,將Checkbox重命名為IsSelected並將私有變量更新為isSelected之類。

在這種情況下,Id會將變量重命名為IsChecked或ComboBoxIsChecked。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM