c# - 使用按钮打开 WPF 弹出窗口

标签 c# wpf popup icommand relaycommand

我正在尝试使用按钮打开一个弹出窗口,并实现了一个基本的 ICommand。该按钮绑定(bind)到 ICommand OpenPopupCommand,而 Popup IsOpen 属性绑定(bind)到“IsOpen”OnPropertyChanged。我的思考过程是将 Popup.IsOpen 属性绑定(bind)到 ICommand 以及让 IT 触发 OnPropertyChange 但无法让它工作。我想我已经很接近了,但无法弄清楚。这是我到目前为止的代码:

    #region ICommand Members

    private ICommand _openPopupCommand;
    public ICommand OpenPopupCommand
    {
        get
        {
            if (_openPopupCommand == null)
                _openPopupCommand = new RelayCommand(param => OpenPopupExecute(param));
            return _openPopupCommand;
        }
        set 
        {
            _openPopupCommand = value;
        }
    }

    #endregion

    #region Methods

    public void OpenPopupExecute(object parameter)
    {
        parameter = true;
        OnPropertyChanged("IsOpen");
    }

    #endregion

“弹出”Popup 和 Popup XAML 的按钮:

<Popup x:Name="FieldsPopup" Placement="Center" Width="400" Height="250" IsOpen="{Binding IsOpen}">
                    <StackPanel>
                        <TextBlock Background="LightBlue" HorizontalAlignment="Center" VerticalAlignment="Center" Height="250" Width="350" TextAlignment="Center" >This is a popup</TextBlock>
                    </StackPanel>
                </Popup>
<Button Name="button_PatientIdentifierList" Width="23" Height="23" Grid.Column="2" Foreground="Black" Background="#FFCDCDCD" BorderBrush="#FF707070" Margin="3.4,4,4,0" VerticalAlignment="Top" Command="{Binding OpenPopupCommand}"/>

最佳答案

您正在发出 PropertyChange 通知,但我没有看到您实际上在任何地方更改了该属性。

除非我弄错了,这里的代码采用 CommandParameter (此处称为 parameter)并将其设置为 true

public void OpenPopupExecute(object parameter)
{
    parameter = true;
    OnPropertyChanged("IsOpen");
}

但是在您的 XAML 中,Button.CommandParameter 未绑定(bind)到任何内容

<Button Command="{Binding OpenPopupCommand}"/>

所以我怀疑 parameter 只是 null,实际上并没有在这里做任何事情。

您似乎缺少的是实际的 IsOpen 属性定义,并在命令的执行代码中将其设置为 true :

private bool _isOpen;
public bool IsOpen
{
    get
    {
        return _isOpen;
    }
    set 
    {
        _isOpen = value;
        OnPropertyChanged("IsOpen");
    }
}

public void OpenPopupExecute(object parameter)
{
    IsOpen = true; // Will call OnPropertyChanged in setter
}

顺便说一句,我真的不喜欢 WPF 的默认 PopupControl,并且有一个 custom UserControl version of it on my blog如果您也决定讨厌 WPF 的默认 PopupControl :)

关于c# - 使用按钮打开 WPF 弹出窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24963938/

相关文章:

c# - ASP.NET Web 应用程序 session 问题

c# - 使用 C# 强制本地用户在下次登录时更改密码

c# - 如何将图像与线条合并并将两者保存在文件中?

javascript - 将 javascript 函数传递给使用 window.open() 打开的子窗口

c# - 如何在 Linux 上运行 .NET Core 控制台应用程序

c# - 报告查看器 - 在同一页上换行表

wpf - MVVM 限制代码背后?

wpf - FormatConvertedBitmap 黑白结果不佳

javascript - 窗口退出时的模态弹出窗口

popup - 避免 chrome 弹出扩展程序关闭