Caliburn.Micro를 사용하고 있으며 확인 가능한 메뉴 항목을 추가하려고합니다. 이 액션의 처리기는 메뉴 항목의 상태 (체크 여부)를 알아야합니다.Checkable 메뉴 항목의 이벤트 처리기에서 IsChecked 속성을 얻는 방법
XAML (오류 복구를위한 코드를 포함하지 않음)
<MenuItem Header="Laser" x:Name="ToggleLaser" VerticalAlignment="Top" IsCheckable="True" IsChecked="{Binding LaserState}" >
뷰 모델 :
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는에 allways 거짓이었다.
public IEnumerable<IResult> ToggleLaser(RoutedEventArgs eventArgs)
{
var menuItem = (MenuItem)eventArgs.OriginalSource;
var isChecked = menuItem.IsChecked;
return ToggleLaser(isChecked);
}
을하지만 내 뷰 모델은 내보기에 바인딩 - 좋은하지 :
나는 있는 EventArgs를 얻을 수 있습니다.
여기에 좋은 답변을 찾을 수 없으므로 메뉴 항목에 대한 꽤 일반적인 사용 사례라고 생각합니다.
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이된다 : 내가 생각 해낸
왜''과 같은 사용자 표준 바인딩을 사용하지 않으시겠습니까? 'caliburn'에서 뭔가가 바뀌 었습니까? –
당신은 정확합니다 - 표준 바인딩 작업 - 제 질문은 명확하지 않았습니다 - 문제는 ToggleLaser가 시간이 걸리는 것입니다 - 질문에있는 코드를 업데이트 할 것입니다 – espenalb