2012-06-22 53 views
3

我有一個DataTemplate XAML,目前看起來像這樣的報告屏幕如何在xaml中的複選框對象上禁用dash + equals?

<CheckBox> 
     <StackPanel> 
      <TextBlock Text="{Binding Path=DisplayName}" FontWeight="Bold" Margin="0 0 0 5" /> 
      <RadioButton Content="All Pages" IsChecked="{Binding Path=AllPages}" Margin="0 0 0 5" /> 
      <RadioButton> 
       <StackPanel Orientation="Horizontal"> 
        <TextBlock Text="Pages: " Margin="0 3 5 0" /> 
        <TextBox Width="130" Text="{Binding Path=SelectedValue}" /> 
       </StackPanel> 
      </RadioButton> 
     </StackPanel> 
    </CheckBox> 

我想知道,我怎麼能禁止使用默認複選框行爲「 - 」和「=」作爲赤和取消。

我想允許用戶在文本框中輸入「1-5,6,7」的頁面範圍,但不能這樣做,因爲「 - 」是檢查和取消勾選框

編輯:我想維護空格鍵功能來檢查+取消選中複選框。無論出於何種原因,如果我在文本框中並鍵入空格,它不會觸發切換事件,但' - '和'='會執行。

EDIT2:理想情況下尋找一個XAML修復,因爲我試圖保持MVVM架構和不希望背後有

+2

應當指出的是絕對沒有錯的代碼隱藏在MVVM如果代碼只涉及查看,並沒有任何業務邏輯。例如,將'TextBox'移動到'CheckBox'之外,並在'KeyPress'事件中檢查該鍵是否等於空格,如果是,則選中/取消選中「CheckBox」。 – Rachel

回答

0

try代碼空指令覆蓋的鍵盤快捷鍵:

<RadioButton> 
     <KeyBinding Key="OemMinus" Command="{Binding EmptyCommand}"/> 
</RadioButton> 

而在你的視圖模型:

//使用System.windows.input

public Icommand EmptyCommand = ApplicationCommands.NotACommand; 
2

CheckBox.OnKeyDown是罪魁禍首(請參閱http://msdn.microsoft.com/en-us/library/system.windows.controls.checkbox.onkeydown.aspx)。我通過製作覆蓋OnKeyDown的自定義CheckBox類來解決這個問題,並且什麼也不做。 VB解決方案如下所示:

Public Class IgnoreKeyboardCheckBox 
    Inherits CheckBox 

    Protected Overrides Sub OnKeyDown(e As System.Windows.Input.KeyEventArgs) 
     If e.Key = Key.Space Then 
      MyBase.OnKeyDown(e) 
     End If 
    End Sub 
End Class 

只要您需要複選框忽略鍵盤輸入,就可以使用此類而不是CheckBox。

0

在此處可以看到CheckBox.cs source code in C# .NET,對於雙態複選框,存在Key.Add, Key.Subtract, Key.OemPlus, Key.OemMinus的自定義行爲。

(以編程方式)添加命令不適用於我。在子類中重寫所做的:

protected override void OnKeyDown(KeyEventArgs e) 
{ 
    // Non ThreeState Checkboxes natively handle certain keys. 
    if (SuppressNativeKeyDownBehaviour(e.Key)) 
    return; 

    base.OnKeyDown(e); 
} 

private bool SuppressNativeKeyDownBehaviour(Key key) 
{ 
    switch (key) 
    { 
    case Key.Add: 
    case Key.Subtract: 
    case Key.OemPlus: 
    case Key.OemMinus: 
     return true; 
    default: 
     return false; 
    } 
}