здравствуйте, нужно, чтобы параметром команды щелчка по checkbox был сам этот checkbox и возможно было в viewModel считать Uid этого checkbox. максимально упростил свой код...
<ListBox ItemsSource="{Binding Collection}">
<ListBox.ItemTemplate>
<DataTemplate>
<CheckBox Command="{Binding CheckBoxCommand}"
CommandParameter="{Binding RelativeSource={RelativeSource Self}}"
Uid="{Binding Element.Id}"/> <!--прибиндили к полю id поля Element из структуры из которых состоит Collection -->
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
RelayCommand:
public class RelayCommand<T> : ICommand
{
private readonly Action<T> _execute;
private readonly Predicate<T> _canExecute;
public event EventHandler CanExecuteChanged;
public RelayCommand(Action<T> execute)
: this(execute, null)
{
}
public RelayCommand(Action<T> execute, Predicate<T> canExecute)
{
if (execute == null)
throw new ArgumentNullException("предикат не должен быть равным нулю");
_execute = execute;
_canExecute = canExecute;
}
public bool CanExecute(object parameter)
{
return _canExecute == null ? true : _canExecute((T)parameter);
}
public void Execute(object parameter)
{
_execute((T)parameter);
}
public void RaiseCanExecuteChanged()
{
var handler = CanExecuteChanged;
if (handler != null)
{
handler(this, EventArgs.Empty);
}
}
}
viewModel:
class ViewModel
{
/// <summary>
/// команда щелчка по checkbox
/// </summary>
private ICommand checkBoxCommand = null;
public ICommand CheckBoxCommand
{
get
{
if (checkBoxCommand == null)
{
checkBoxCommand = new RelayCommand<CheckBox>(AddData);
}
return checkBoxCommand;
}
}
private void AddData(CheckBox o)
{
var df = ((CheckBox)o).Uid;
int brackPoint = 0;
}
/// <summary>
/// конструктор
/// </summary>
public ViewModel()
{
}
public ObservableCollection<Element> Collection
{
/**/
}
}
Model(упрощенно):
Struct Element {
public ObservableCollection<someClass> Collection
{ /**/ }
public int Id { /**/ };
}
ставлю бряк в addData и щелкаю по checkBox - не заходит в addData, однако ошибок никаких нету... помогите решить проблему
Привязывайтесь к контексту окна по имени. Вы переопределили контекст когда задали ItemSource.
<Window x:Name="Main" ...
<CheckBox Command="{Binding DataContext.CheckBoxCommand, ElementName=Main}"...
Совет. Для того, чтобы сохранить изоляцию ViewModel от View рекомендую передавать в качестве параметра не CheckBox
, а Element
<CheckBox Command="{Binding DataContext.CheckBoxCommand, ElementName=Main}"
CommandParameter="{Binding}"...
ViewModel:
checkBoxCommand = new RelayCommand<Element>(AddData);
private void AddData(Element e)
{
var df = e.Id;
...
}
Виртуальный выделенный сервер (VDS) становится отличным выбором
Например, есть какой-то известный пользовательский тип(его либа есть в проекте), который приведен к типу object