Привязка из контекстного меню

195
20 октября 2018, 15:00

Есть DataGrid в которой в DataGridRowDetail нужно сделать binding context menu к главной view model. Как это сделать? Оно сейчас пишет что не может найти property непосредственно в ObservableCollection DataGridRows а мне нужно чтоб оно искало не в коллекции а в view model где коллекция

Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Window', AncestorLevel='1''. BindingExpression:Path=DataContext.OpenEditWindowCommand; DataItem=null; target element is 'MenuItem' (Name=''); target property is 'Command' (type 'ICommand')

<TabControl>
  <TabItem>
    <DataGrid>
      <DataGrid.RowDetailsTemplate>
        <DataTemplate>
          <DataGrid>
            <DataGrid.ContextMenu>
              <ContextMenu>
                <ContextMenu.Items>
                  <MenuItem Command="{Binding 
                    DataContext.OpenEditWindowCommand,
                    RelativeSource={RelativeSource FindAncestor, 
                    AncestorType=Window},
                    UpdateSourceTrigger=PropertyChanged}">
                 </MenuItem>
               </ContextMenu.Items>
             </ContextMenu>
            </DataGrid.ContextMenu>
          </DataGrid>
        </DataTemplate>
      </DataGrid.RowDetailsTemplate>
    </DataGrid>
  </TabItem>
</TabControl>
Answer 1

Дело в том, что контекстное меню лежит отдельно от визуального дерева окна, поэтому FindAncestor не сработает — он ищет только вверх по дереву. Не сработает здесь и фича ElementName, потому что она ищет тоже только внутри дерева (хоть и не только вверх).

Что вам поможет — это фича x:Reference (доступно с .NET 4.0), она ищет по всему XAML. Присвойте в разметке окну имя, например <Window ... Name="w"> и укажите его как источник:

<MenuItem Command="{Binding DataContext.OpenEditWindowCommand,
                            Source={x:Reference w},
                            UpdateSourceTrigger=PropertyChanged}">
READ ALSO
Смещение часового пояса ASP.NET MVC

Смещение часового пояса ASP.NET MVC

У меня есть сайт и серверХочу, чтобы клиентам из разных часовых поясов показывалось разное время

195
Парсинг значения json с помощью Newtonsoft на с#

Парсинг значения json с помощью Newtonsoft на с#

Задача: получить значение "lastPriceProtected"

215
Изменить .cs на .cshtml

Изменить .cs на .cshtml

После обновления vs все вьюшки изменились сcshtml в g

176
Как можно по условию переданному в конструктор, выбрать переопределяемые методы в C#

Как можно по условию переданному в конструктор, выбрать переопределяемые методы в C#

Есть дочерний класс, он оверайдит некоторые методы родительскогоИ вопрос в том, как можно заоверайдить только те методы, которые нужны предположим...

186