Я использую WPF с MVVM design-patern, и мне нужно привязать команду, которая является родительским элементом привязки ItemsSource: Вид :
<Window x:Class = "TaskSupervisor.MainWindow"
...
...>
<Window.DataContext>
<local:TacheGroupeViewModel/>
</Window.DataContext>
<Grid>
<TreeView x:Name = "TachesTree" ItemsSource = "{Binding TachesGroupes.GroupesConfig}">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource = "{Binding Value.Tasks}">
<HierarchicalDataTemplate.ItemTemplate>
<DataTemplate>
<Grid>
<CheckBox x:Name = "InProgress"
IsChecked = "{Binding ModifInProgress}">
</CheckBox>
<StackPanel Grid.Row = "2" Grid.Column = "2" Orientation = "Horizontal">
...
</StackPanel>
<StackPanel Grid.Row = "3" Grid.Column = "2" Orientation = "Horizontal">
...
</StackPanel>
</Grid>
</DataTemplate>
</HierarchicalDataTemplate.ItemTemplate>
<TextBlock Text = "{Binding Value.DisplayGroupe, Mode=OneWay}"/>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
</Grid>
</Window>
ViewModel:
class TacheGroupeViewModel : INotifyPropertyChanged {
public Model.TachesGroupes TachesGroupes { get; set; }
public TacheGroupeViewModel() {
this.TachesGroupes = new Model.TachesGroupes();
// return a Dictionary<string, CustomClass> Object
// CustomClass => Contain some field and a List Of custom class
}
private ICommand _cmdEnCoursDeTraitement;
public ICommand CmdEnCoursDeTraitement {
get {
return _cmdEnCoursDeTraitement ?? ( _cmdEnCoursDeTraitement = new RelayCommand(x => {Test(); }) );
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void RaisePropertyChanged(string propertyName) {
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
public void Test() {
var test = "xD";
}
}
Я хочу привязать свой объект Checkbox: как я могу это сделать, когда для источника Items HierarchicalDataTemplate установлено значение «Tasks», я могу привязать только свои поля «Tasks». Как получить родительский элемент для ItemSource?
Другой вариант - добавить ссылку на родительский элемент на TacheGroupeViewModel и перейти по ней для привязки.
Возможно, я делаю это неправильно, это мое первое настоящее приложение MVVM, может быть, есть более глубокая проблема с тем, как я это делаю
Где команда? Я не вижу, есть ли в XAML.
Здесь нет причины неправильной привязки. Но если бы я привязал команду к флажку, как я могу получить свою команду ViewModel Icommand?
Похоже, ваша модель просмотра - это то, к чему привязан Window. Просто назовите элемент Window и укажите ElementName как часть привязки к DataContext. Итак, <CheckBox Command = "{Binding Path=DataContext.CmdEnCoursDeTraitement, ElementName=TheWindowName}" />.
Вы до сих пор не объяснили, где будет находиться команда. Или где вы хотите, чтобы это было.





вместо того, чтобы найти правильную модель родителя и представления ... У меня был шаблон Forward в основном для контекстного меню ...
Вся моя модель представления имеет эту команду
private ICommand forwardCommand;
public ICommand ForwardCommand
{
get
{
if (forwardCommand == null)
forwardCommand = new RelayCommand<string>(
delegate(string param)
{
Messenger.Default.Send<CommandContext>(GetForwardCommandContext(param),
ViewModelBaseMessages.ContextCommand );
},
delegate(string param)
{
return CanForwardCommand(param);
});
return forwardCommand;
}
}
затем он пересылается в модель представления, которая зарегистрировалась в forward_message
Messenger.Default.Register<CommandContext>(this, ViewModelBaseMessages.ContextCommand,
(CommandContext o) =>
{
ExecuteDistantCommand( o );
} );
вы можете найти этот код в моем проекте на github пожалуйста, используйте mvvm nuget, например mvvmlight, и не изобретайте колесо ... ;-)
Вы бы использовали привязку к родственному источнику. Я не понимаю, где будет modifinprogress. Если он находится в элементе просмотра дерева, который находится на один уровень выше, то Binding DataContext.YouProperty, родственный источник типа предка treeviewitem и уровень предка 2. Если он находится в модели просмотра окна, то родственным источником будет древовидное представление (которое предположительно будет иметь тот же текст данных, что и окно).