【问题标题】:Open a WPF Popup with a button使用按钮打开 WPF 弹出窗口
【发布时间】:2014-07-25 20:24:55
【问题描述】:

我正在尝试用一个按钮打开一个弹出窗口并实现了一个基本的 ICommand。该按钮绑定到 ICommand OpenPopupCommand,而 Popup IsOpen 属性绑定到“IsOpen”OnPropertyChanged。我的想法是将 Popup.IsOpen 属性绑定到 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}"/>

【问题讨论】:

  • 我认为如果您在代码方面提供更多上下文会很有价值。
  • "Popup IsOpen 属性绑定到 "IsOpen" OnPropertyChanged" 到底想表达什么?听起来您想说您在依赖属性和方法之间进行了绑定——这是不可能的,也没有意义。 (另请注意,Popup.IsOpen NOT 是一个属性,它是一个依赖属性。属性完全是另外一回事......)
  • 请把 xaml 也发给你。
  • 您的代码虽然不完整,但看起来还不错,但如果没有您的 xaml 标记,我们就无法判断。我希望 OnPropertyChanged("IsOpen") 在 INotifyPropertyChanged 接口中引发事件,但我们在这里猜测 =)。请完整的代码和xaml。
  • @User1489726 抱歉……

标签: c# wpf popup icommand relaycommand


【解决方案1】:

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

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

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

但是在您的 XAML 中,Button.CommandParameter 没有绑​​定到任何东西

<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,如果您决定自己也讨厌 WPF 的默认 PopupControl,请使用 custom UserControl version of it on my blog :)

【讨论】:

  • parameterOpenPopupExecute mMethod 的参数变量,因此是方法的局部变量。为该变量分配不同的值在该方法之外没有任何影响......因此,您对 CommandParameter 的思考是没有根据的。无论如何,我只是在吹毛求疵。关于 IsOpen 的另一个更重要的部分当然是合理且真实的。 (好吧,还有一些吹毛求疵:最好保护 setter,这样如果属性设置为它已经具有的值,则不会引发事件 :))
  • @Rachel 我感谢您的 PopupControl 的客户 UserControl 版本!我有点菜鸟(如果你看不出来的话),可能会迷路,但我会看看!此外,我的解决方案与您发布的解决方案类似,唯一的区别是 OpenPopupExectue 正文没有 IsOpen = true; 部分。我做出了改变,我们成功了!谢谢大家的帮助!
  • @Rachel 我同意默认的弹出控件不是很好用,我和你一样。它不是可视化树的一部分,并且控件存在大量问题。特别是在 XBAP 应用程序方面...
猜你喜欢
  • 2018-12-18
  • 2022-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多