Я запускаю простой проект MVVM и упал в первый барьер. Я связываю свои команды с помощью подхода Josh Smiths Relay Command.Невозможно связать в словаре ресурсов
Проблема в том, что кнопка не является обязательной, когда кнопка находится в ResourceDictionary. Если я переведу код (точно так же, как есть) в свой MainWindow.xaml, тогда код будет выполняться по желанию.
Это мой MainWindow.xaml
<Window x:Class="ForJon.Views.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vm="clr-namespace:ForJon.Ui.ViewModels"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="160" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Grid.Resources>
<ResourceDictionary Source="Resources\ResourceDictionary.xaml" />
</Grid.Resources>
<Grid.DataContext>
<vm:MainWindowViewModel />
</Grid.DataContext>
<HeaderedContentControl
Header="Options"
Style="{StaticResource LeftMenu}"
Grid.Column="0"
/>
</Grid>
</Window>
И словарь ресурс
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:view="clr-namespace:ForJon.Ui.Views"
xmlns:viewModel="clr-namespace:ForJon.Ui.ViewModels"
>
<Style x:Key="LeftMenu" TargetType="HeaderedContentControl">
<Setter Property="HeaderTemplate">
<Setter.Value>
<DataTemplate>
<StackPanel>
<Button Content="Add" Command="{Binding AddCommand}" />
</StackPanel>
</DataTemplate>
</Setter.Value>
</Setter>
<Setter Property="Width" Value="160"/>
</Style>
</ResourceDictionary>
Я могу только предположить, что при связывании в ResourceDictionary, что он не может найти ViewModel (хотя я дон Я не знаю, почему я так думаю. Я думаю, что он пытается связать дополнительный уровень вниз ...
В любом случае, может кто-нибудь объяснить, почему он не выполняется из Словаря ресурсов, пожалуйста.
Это решает проблему, но, безусловно, должно быть более элегантный подход, чем то, что я сделал? Было бы лучше объявить DataContext в словаре ресурсов вместо этого? Спасибо! – Dave
@DaveRook Получение DataContext через привязку RelativeSource неплохо, когда вы знаете, что делаете. Однако, если вы попросите мое личное мнение, я бы тоже этого не сделал. Концепция ресурсного словаря - это повторное использование элементов управления, но когда у нас есть привязка к ресурсному словарю, вы в основном привязали «стиль» до очень специфического VM и View, что означает, что вам, возможно, было бы лучше определить его в самом элементе непосредственно. – Viv
Wow, Viv, спасибо. Пиво на меня для этого. Да, я понимаю, почему вы придерживаетесь такого подхода, это поистине превосходная и огромная помощь. – Dave