我的代碼的問題是RadioButton
的綁定,並且不允許委託修改屬性。委託它更改並綁定,它將更改爲舊值。我需要能夠通過命令和RadioButton
s來改變財產。RadioButtons通過命令更改屬性
<Window.InputBindings>
<KeyBinding Key="F1" Command="{Binding SomeCommand}"/>
</Window.InputBindings>
<StackPanel>
<TextBlock Text="{Binding Path=SomeProperty}"/>
<RadioButton IsChecked="{Binding Path=SomeProperty, Mode=TwoWay, Converter={StaticResource ETBConverter}, ConverterParameter=State1}" Content="State1"/>
<RadioButton IsChecked="{Binding Path=SomeProperty, Mode=TwoWay, Converter={StaticResource ETBConverter}, ConverterParameter=State2}" Content="State2"/>
</StackPanel>
public enum TestEnum
{
State1,
State2,
}
public class TestViewModel : BaseViewModel
{
private TestEnum _someProperty;
public TestEnum SomeProperty
{
get { return _someProperty; }
set
{
if (_someProperty != value)
{
_someProperty = value;
OnPropertyChanged();
}
}
}
public Command SomeCommand { get; private set; }
public TestViewModel()
{
_someProperty = TestEnum.State2;
SomeCommand = new Command(SomeCommand_Execute);
}
private void SomeCommand_Execute(object obj)
{
SomeProperty = SomeProperty == TestEnum.State1 ? TestEnum.State2 : TestEnum.State1;
}
}
更新1:
[Localizability(LocalizationCategory.NeverLocalize)]
public class EnumToBooleanConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
string parameterString = parameter as string;
if (parameterString == null)
return false;
if (Enum.IsDefined(value.GetType(), value) == false)
return false;
object parameterValue = Enum.Parse(value.GetType(), parameterString);
return parameterValue.Equals(value);
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
string parameterString = parameter as string;
if (parameterString == null)
return DependencyProperty.UnsetValue;
return Enum.Parse(targetType, parameterString);
}
}
public abstract class BaseViewModel : NotifyPropertyChanged
{
protected Dispatcher UIDispatcher;
public BaseViewModel()
{
UIDispatcher = Dispatcher.CurrentDispatcher;
}
protected void InvokeInUIThread(Action action)
{
if (Thread.CurrentThread == UIDispatcher.Thread)
action();
else
UIDispatcher.InvokeAsync(action, DispatcherPriority.Send);
}
}
public abstract class NotifyPropertyChanged : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged([CallerMemberName] String propertyName = "")
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
public class Command : ICommand
{
#region Fields
readonly Action<object> _execute;
readonly Predicate<object> _canExecute;
#endregion // Fields
#region Constructors
public Command(Action<object> execute)
: this(execute, null)
{
}
public Command(Action<object> execute, Predicate<object> canExecute)
{
if (execute == null)
throw new ArgumentNullException("execute");
_execute = execute;
_canExecute = canExecute;
}
#endregion // Constructors
#region ICommand Members
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
public bool CanExecute(object parameter)
{
return _canExecute == null ? true : _canExecute(parameter);
}
public void Execute(object parameter)
{
_execute(parameter);
}
public void OnCanExecutedChanged()
{
CommandManager.InvalidateRequerySuggested();
}
#endregion // ICommand Members
}
把一些斷點SomeCommand_Execute如果可達。 – AnjumSKhan
@AnjumSKhan它會給我什麼? – Nodon
它會告訴你,如果你的SomeCommand_Execute方法正在見證一些執行或沒有?如果它無法實現將如何執行?也請分享你的Command類代碼。 – AnjumSKhan