Я нашел, что порядок, в котором я установил Команду и CommandParameter, имеет значение. Установка свойства Command заставляет CanExecute быть сразу названным, таким образом, Вы хотите, чтобы CommandParameter уже был установлен в той точке.
я нашел, что переключение порядка свойств в XAML может на самом деле иметь эффект, хотя я не уверен, что это решит Вашу проблему. Это стоит попытки, все же.
Вы, кажется, предполагаете, что кнопка никогда не становится включенной, что удивительно, так как я ожидал бы, что CommandParameter будет установлен вскоре после свойства Command в Вашем примере. Делает вызов CommandManager. InvalidateRequerySuggested () заставляют кнопку становиться включенной?
есть две взаимосвязанные концепции, обе называемые «аргументы ключевого слова».
На вызывающей стороне, о чем упоминали другие комментаторы, у вас есть возможность указать некоторые аргументы функции по имени . Вы должны упомянуть их после всех аргументов без имен (позиционные аргументы), и должны быть значения по умолчанию для любых параметров, которые вообще не упоминались.
Другая концепция находится на стороне определения функции: вы можете определить функция, которая принимает параметры по имени - и вам даже не нужно указывать, что это за имена. Это чисто ключевые аргументы, и их нельзя передать позиционно. Синтаксис:
def my_function(arg1, arg2, **kwargs)
Любые аргументы ключевого слова, переданные в эту функцию, будут помещены в словарь с именем kwargs. Вы можете проверить ключи этого словаря во время выполнения, например:
def my_function(**kwargs):
print str(kwargs)
my_function(a=12, b="abc")
{'a': 12, 'b': 'abc'}
Использование аргументов ключевого слова - то же самое, что и обычные аргументы, за исключением того, что порядок не имеет значения. Например, два вызова функций ниже одинаковы:
def foo(bar, baz):
pass
foo(1, 2)
foo(baz=2, bar=1)
Перед ними нет ключевых слов. Порядок важен!
func(1,2,3, "foo")
У них есть ключевые слова впереди. Они могут быть в любом порядке!
func(foo="bar", baz=5, hello=123)
func(baz=5, foo="bar", hello=123)
Вы также должны знать, что если вы используете аргументы по умолчанию и не вставляете ключевые слова, тогда порядок будет иметь значение!
def func(foo=1, baz=2, hello=3): ...
func("bar", 5, 123)
Есть еще одна языковая особенность, для которой важно различие. Рассмотрим следующую функцию:
def foo(*positional, **keywords):
print "Positional:", positional
print "Keywords:", keywords
Аргумент * positional
будет хранить все позиционные аргументы, переданные в foo ()
, без ограничения количества, которое вы можете предоставить.
>>> foo('one', 'two', 'three')
Positional: ('one', 'two', 'three')
Keywords: {}
Аргумент ** keywords
будет хранить любые аргументы ключевых слов:
>>> foo(a='one', b='two', c='three')
Positional: ()
Keywords: {'a': 'one', 'c': 'three', 'b': 'two'}
И, конечно, вы можете использовать оба одновременно:
>>> foo('one','two',c='three',d='four')
Positional: ('one', 'two')
Keywords: {'c': 'three', 'd': 'four'}
Эти функции используются редко, но иногда они очень полезны, и важно знать, какие аргументы являются позиционными или ключевыми.
Я удивлен, что никто не упомянул тот факт, что вы можете смешивать позиционные и ключевые аргументы, чтобы делать такие хитрые вещи, используя * args
и ** kwargs
( с этого сайта ):
def test_var_kwargs(farg, **kwargs):
print "formal arg:", farg
for key in kwargs:
print "another keyword arg: %s: %s" % (key, kwargs[key])
Это позволяет вам использовать произвольные аргументы ключевых слов, которые могут иметь ключи, которые вы не хотите определять заранее.
Есть два способа присвоить значения аргументов параметрам функции, оба используются:
По позиции. Позиционные аргументы не имеют ключевых слов и назначаются первыми.
По ключевому слову. Аргументы ключевого слова имеют ключевые слова и назначаются вторыми после позиционных аргументов.
Обратите внимание, что вы можете использовать позиционные аргументы.
Если вы не используете позиционные аргументы , тогда - да - все , которое вы написали, оказывается аргументом ключевого слова.
Когда вы вызываете функцию, вы принимаете решение использовать позицию, ключевое слово или их сочетание . Вы можете выбрать все ключевые слова, если хотите. Некоторые из нас не делают этого выбора и используют позиционные аргументы.