Próbuję powiązać widok z ViewModel w ResourceDictionary, ale to nie działa.Powiązanie danych WPF z ResourceDictionary MVVM
Aplikacja jest bardzo prostym oknem z 2 polami tekstowymi. Kiedy wpisuję tekst do textbox1, atutomatycznie, textbox2 musi mieć ten sam tekst. Oczywiście moje pola tekstowe z widoku muszą być powiązane z moimi właściwościami w ViewModel.
Jestem nowym do WPF i sposób zacząłem wiązać widoków i ViewModels był w kodzie z widoku:
DataContext = new MyViewModel();
Teraz próbuję osiągnąć czystsze separacji. Mój kod jest
App.xaml:
<Application x:Class="NavigationCleanBinding.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="/Views/MainWindowView.xaml">
<Application.Resources>
<ResourceDictionary Source="MainResourceDictionary.xaml" />
</Application.Resources>
</Application>
MainResourceDictionary.xaml:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xamlpresentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:Views="clr-namespace:NavigationCleanBinding.Views"
xmlns:ViewModels="clr-namespace:NavigationCleanBinding.ViewModels">
<DataTemplate DataType="{x:Type ViewModels:MainWindowViewModel}">
<Views:MainWindowView />
</DataTemplate>
</ResourceDictionary>
MainWindowView.xaml:
<Window x:Class="NavigationCleanBinding.Views.MainWindowView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<TextBox Height="23" HorizontalAlignment="Left" Margin="61,14,0,0"
Name="textBox1" VerticalAlignment="Top" Width="120"
Text="{Binding TestData, Mode=TwoWay,
UpdateSourceTrigger=PropertyChanged}"/>
<Label Content="Test:" Height="28" HorizontalAlignment="Left" Margin="12,12,0,0"
Name="label1" VerticalAlignment="Top" Width="43" />
<Label Content="Result:" Height="28" HorizontalAlignment="Left" Margin="10,46,0,0"
Name="label2" VerticalAlignment="Top" />
<TextBox Height="23" HorizontalAlignment="Left" Margin="61,48,0,0"
Name="textBox2" VerticalAlignment="Top" Width="120"
Text="{Binding TestData, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>
</Grid>
</Window>
MainWindowViewModel:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace NavigationCleanBinding.ViewModels
{
class MainWindowViewModel
{
private String _testData;
public String TestData
{
get { return _testData; }
set { _testData = value; }
}
private MainWindowViewModel()
{
_testData = null;
}
}
}
UPDATE:
Zmieniłem testdata własności do tego:
public String TestData
{
get { return _testData; }
set
{
_testData = value;
OnPropertyChanged("TestData");
}
}
I implemened z INotifyPropertyChanged tak:
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(String propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
Czy otrzymujesz jakieś błędy w oknie wyjściowym? – Thelonias
Brak błędów, brak ostrzeżeń. To po prostu nie działa. – shadox
Nie sądzę, twój DataContext jest ustawiony dla twojego 'MainWindowView'. Myślę, że zamiast tego 'MainWindowViewModel' jest DataContext dla' MainResourceDictionary'. Ponieważ masz zestaw StartupURI ustawiony na MainWindowView, utworzy on instancję twojego okna, ale nigdy nie ustawi DataContext. Nie jestem pozytywny, ale nie sądzę, że twój ResourceDictionary coś robi w tym momencie. – Thelonias