Tôi đang cố gắng ràng buộc Chế độ xem với một ViewModel trong ResourceDictionary nhưng nó không hoạt động.Kết nối dữ liệu WPF với ResourceDictionary MVVM
Ứng dụng này rất đơn giản với 2 hộp văn bản. Khi tôi nhập văn bản vào textbox1, atutomatically, textbox2 phải nhận được cùng một văn bản. Tất nhiên các hộp văn bản của tôi từ View phải được liên kết với các thuộc tính của tôi trong ViewModel.
Tôi mới để WPF và cách tôi bắt đầu để ràng buộc xem và ViewModels là trong codebehind của một Xem:
DataContext = new MyViewModel();
Bây giờ tôi đang cố gắng để đạt được một sự tách biệt rõ ràng hơn. Mã của tôi là
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:
tôi đã thay đổi TestData tài sản như sau:
public String TestData
{
get { return _testData; }
set
{
_testData = value;
OnPropertyChanged("TestData");
}
}
Và implemened các INotifyPropertyChanged như thế này:
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(String propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
Bạn có gặp phải bất kỳ lỗi nào trong cửa sổ Đầu ra không? – Thelonias
Không có lỗi, không có cảnh báo. Nó chỉ không hoạt động. – shadox
Tôi không nghĩ DataContext của bạn đang được đặt cho 'MainWindowView' của bạn. Tôi nghĩ, thay vào đó, 'MainWindowViewModel' là DataContext cho' MainResourceDictionary'. Bởi vì bạn đã thiết lập StartupURI của bạn thành MainWindowView, nó sẽ tạo ra một cá thể của Window của bạn, nhưng không bao giờ thiết lập DataContext. Tôi không tích cực, nhưng tôi không nghĩ rằng ResourceDictionary của bạn đang làm bất cứ điều gì vào thời điểm này. – Thelonias