簡體   English   中英

如何在可檢查菜單項的事件處理程序中獲取IsChecked屬性

[英]How to get the IsChecked property in the event handler of a checkable menu item

我正在使用Caliburn.Micro-並希望添加一個可檢查的menuitem。 此操作的處理程序需要知道菜單項的狀態-是否選中。

XAML:

<MenuItem Header="Laser" x:Name="ToggleLaser" VerticalAlignment="Top" IsCheckable="True" IsChecked="{Binding LaserState}" >

ViewModel(不包括錯誤恢復代碼):

public IEnumerable<IResult> ToggleLaser(bool isChecked)
{
    yield return BusyResult.Show("Turning laser " + (isChecked ? "on" : "off");
    if (isChecked) 
        yield return TurnOnLaserAsync().AsResult();
    else
        yield return TurnOffLaserAsync().AsResult();            
    LaserState = isChecked;
    yield return BusyResult.Hide();
}

這不起作用-isChecked始終為假。

可以得到eventargs:

public IEnumerable<IResult> ToggleLaser(RoutedEventArgs eventArgs)
{
    var menuItem = (MenuItem)eventArgs.OriginalSource;
    var isChecked = menuItem.IsChecked;
    return ToggleLaser(isChecked);
}

但是,然后我的viewmodel綁定到我的視圖-不好。

我在這里找不到很好的答案,因此將其發布在這里,因為我確定這是菜單項的正常使用案例。

我想出的一種解決方案是通過添加新的databinding關鍵字來擴展caliburn框架:

        MessageBinder.SpecialValues.Add("$ischecked", context =>
        {
            var args = context.EventArgs as RoutedEventArgs;
            if (args == null) {
                return null;
            }
            var fe = args.OriginalSource as MenuItem;
            if (fe == null) {
                return null;
            }
            return fe.IsChecked;
        });

然后我的XAML變成:

<MenuItem Header="Laser" x:Name="ToggleLaser" VerticalAlignment="Top" IsCheckable="True" cal:Message.Attach="ToggleLaser($ischecked)"/>

我的視圖模型變成

public void ToggleLaser(bool turnOn)
    {
        if (turnOn)
            TurnOnLaser();
        else
            TurnOffLaser();
    }

好多了。 :-)

我猜第二種選擇是對menuitem IsChecked屬性進行數據綁定-這具有處理打開激光器時出現錯誤的情況的好處-但我不喜歡在屬性設置器中調用復雜的函數,所以我認為更好的解決方案是綁定IsChecked 使用特定的處理程序。

評論非常感謝。

MenuItem包含IsChecked屬性。

您可以簡單地執行以下操作:

<MenuItem Header="Laser"
          x:Name="ToggleLaser" 
          VerticalAlignment="Top"
          IsCheckable="True"
          IsChecked="{Binding IsLaserOn}">

和ViewModel:

public bool IsLaserOn
{
    get { return this.isLaserOn; }
    set
    {
        if (value == this.isLaserOn)
            return;

        this.isLaserOn = value;
        this.RaisePropertyChanged("IsLaserOn");
        this.ToggleLaser(this.isLaserOn);
    }
}

它比創建一些MessageBinder更簡單。

暫無
暫無

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

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