Вы должны присвоить MainWindow.DataContext
тому же экземпляру LogViewModel
, который создан ViewModelLocator
DataContext="{Binding LogViewModel, Source={StaticResource Locator}}"
, может ли он создать новый экземпляр ViewModelLocator
(и, следовательно, новый LogViewModel
)?
Пожалуйста, поставьте точку останова в строке thisApp.LogTextVm = new LogViewModel();
и проверьте, выполняется ли она дважды?
UPD Выход VS показывает ошибку привязки для вашего кода
System.Windows.Data Error: 40 : BindingExpression path error: 'LogViewModel' property not found on 'object' ''ViewModelLocator' (HashCode=37320431)'. BindingExpression:Path=LogViewModel; DataItem='ViewModelLocator' (HashCode=37320431); target element is 'StackPanel' (Name=''); target property is 'DataContext' (type 'Object')
Вы привязываетесь к неправильным именам, к сожалению. Чтобы исправить привязку, мне пришлось изменить код, как показано ниже:
ViewModelLocator
public class ViewModelLocator
{
public ViewModelLocator()
{
App thisApp = (App)Application.Current;
LogTextVm = new LogViewModel();
thisApp.LogTextVm = LogTextVm;
}
public LogViewModel LogTextVm { get; set; }
}
MainWindow.xaml
<Grid>
<StackPanel DataContext="{Binding LogTextVm, Source={StaticResource Locator}}">
<TextBlock Text="label:" />
<TextBlock Text="{Binding LogText, Mode=TwoWay}" />
<Button Content="click" Click="Button_Click" />
</StackPanel>
</Grid>
DataContext="{Binding LogTextVm, Source={StaticResource Locator}}">
создает ViewModelLocator
экземпляр и связывает StackPanel.DataContext
со свойством ViewModelLocator.LogTextVm
.
<TextBlock Text="{Binding LogText, Mode=TwoWay}" />
привязывается к LogText
для текущего DataContext (который является LogTextVm
значением свойства)