Điều này đã khiến tôi bối rối khi tôi nghĩ rằng tôi đã xem xét mọi thứ nhưng tôi phải thiếu một cái gì đó. Tôi đã đi ra khỏi mô hình MVVM truyền thống từ các tạp chí MSDN:Phương thức ưu tiên để ràng buộc trong MVVM, Mẫu dữ liệu trong tệp Tài nguyên hoặc chỉ DataContext trong chính Chế độ xem?
http://msdn.microsoft.com/en-us/magazine/dd419663.aspx
trong khi học tập MVVM. Tuy nhiên tôi thường sao chép hầu hết các mã và sau đó thay thế nó như tôi cần nhưng hôm nay tôi muốn xây dựng một cái gì đó từ đầu và thấy rằng có thể có nhiều hơn nó hơn tôi nghĩ. MVVM dường như không hoạt động với các ràng buộc khi tôi sử dụng từ điển tài nguyên nhưng thực hiện trực tiếp với datacontext. Câu hỏi này cuối cùng muốn tìm các nhà phát triển khác đề xuất sử dụng ràng buộc mà họ tìm thấy.
Tóm tắt câu hỏi là: Tại sao 'DataTemplate' trong Từ điển tài nguyên xuất hiện để không hoạt động được hiển thị bên dưới, nhưng phương pháp 'DataContext' trực tiếp thực hiện với chế độ xem ngay lập tức cho các ràng buộc?
Có phải vì tôi đang tạo một hỗn hợp mã phía sau với chế độ xem cài đặt trong mã phía sau. Hoặc có khả năng vì cái gì khác. Nó xuất hiện tài sản của tôi và nó thực hiện được thiết lập chính xác trong viewmodel nếu tôi đặt 'DataContext' trực tiếp trong XAML của View, nhưng tại sao không có trong Resource Dictionary? Tôi nghĩ rằng lợi thế của phương pháp đó là bạn có thể thiết lập một loạt các mối quan hệ cùng một lúc. Tôi tò mò nếu có một số thiết lập khác cần phải được thực hiện để làm cho nó hoạt động. Nó là tò mò trong ví dụ chính của phương pháp MVVM họ sử dụng mẫu dữ liệu nhưng nó xuất hiện có nhiều hơn để thiết lập chúng hơn tôi đang làm để có được 'ràng buộc' của họ để làm việc.
GÌ không làm việc cho ME:
Tôi đã cố gắng để làm một số công cụ rất cơ bản trong một XAML cửa sổ chính, để lại một số mã của tôi ra để làm cho nó thậm chí còn đơn giản hơn:
Main Window XAML :
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:dxc="http://schemas.devexpress.com/winfx/2008/xaml/charts" x:Class="WPFTesting12_2.MainWindow"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<ResourceDictionary Source="Resources.xaml"/>
</Window.Resources>
<Grid>
<DockPanel x:Name="dockpanel">
<Menu DockPanel.Dock="Top" Height="30">
<MenuItem Header="Charting">
<MenuItem Header="MVVMDataBound" x:Name="mnuDataBoundSeriesMVVMCharting" Click="mnuDataBoundSeriesMVVMCharting_OnClick"/>
</MenuItem>
</Menu>
<TextBlock Height="5" Background="Black" DockPanel.Dock="Top" />
<DockPanel x:Name="dockchildren" DockPanel.Dock="Bottom"/>
</DockPanel>
</Grid>
</Window>
Main Window Mã Đằng sau:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.WindowState = WindowState.Maximized;
}
private void mnuDataBoundSeriesMVVMCharting_OnClick(object sender, RoutedEventArgs e)
{
View.DataBoundMVVMChart c = new DataBoundMVVMChart();
dockchildren.Children.Clear();
dockchildren.Children.Add(c);
}
}
}
điển Resource:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:vw="clr-namespace:WPFTesting12_2.View"
xmlns:vm="clr-namespace:WPFTesting12_2.ViewModel"
>
<DataTemplate DataType="{x:Type vm:DataBoundMVVMChartViewModel}">
<vw:DataBoundMVVMChart/>
</DataTemplate>
<Style TargetType="MenuItem">
<Setter Property="Background" Value="Wheat"/>
</Style>
<Style TargetType="Menu">
<Setter Property="Background" Value="Wheat"/>
</Style>
</ResourceDictionary>
Xem cho DataBoundMVVMChart.xaml:
<UserControl x:Class="WPFTesting12_2.View.DataBoundMVVMChart"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:WPFTesting12_2.ViewModel"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<UserControl.Resources>
<ResourceDictionary Source="..\Resources.xaml"/>
</UserControl.Resources>
<Grid>
<DockPanel>
<Menu DockPanel.Dock="Top">
<MenuItem Header="TesterContent"/>
</Menu>
<Label DockPanel.Dock="Bottom" Width="300" x:Name="label" Height="50" Foreground="Blue" FontSize="24" Content="{Binding Path=HelloString}"/>
</DockPanel>
</Grid>
</UserControl>
ViewModel để ràng buộc vào Xem trên:
namespace WPFTesting12_2.ViewModel
{
class DataBoundMVVMChartViewModel : INotifyPropertyChanged
{
private string _HelloString;
public string HelloString
{
get { return _HelloString; }
set
{
_HelloString = value;
RaisePropertyChanged("HelloString");
}
}
public DataBoundMVVMChartViewModel()
{
HelloString = "Hello there from the ViewModel";
}
public event PropertyChangedEventHandler PropertyChanged;
protected void RaisePropertyChanged(string propertyName)
{
if (PropertyChanged != null)
PropertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
}
}
}
Được rồi bây giờ là ràng buộc sẽ thất bại trong giao diện nhưng Tuy nhiên, các nguồn lực của màu sắc sẽ đến. Vì vậy, tôi đã nghĩ rằng tôi đã làm điều gì sai trái nhưng mã phía sau sẽ có được tài sản ngay lập tức.Vì vậy, hãy chuyển sang:
GÌ DID LÀM VIỆC:
Magicially nếu tôi chỉ cần thêm bốn dòng để quan điểm:
Thêm phần này vào tờ khai trong phân khúc 'UserControl' ở phía trên:
xmlns:local="clr-namespace:WPFTesting12_2.ViewModel"
Sau đó thiết lập một tham chiếu đến DataContext của UserControl:
<UserControl.DataContext>
<local:DataBoundMVVMChartViewModel/>
</UserControl.DataContext>
Tôi làm theo những gì bạn đang viết nhưng bạn mất tôi khi bạn nêu một phần về việc chèn một đối tượng vào giao diện người dùng. Bạn đang nói về lớp ngoài có tại MainWindow.xaml hoặc bên trong tại userControl gọi là? Tôi chỉ bối rối như tôi có được bản chất những gì các mẫu dữ liệu đang làm nhưng không phải lý do tại sao nó không hoạt động nếu tôi tham khảo ResourceDictionary và nó chọn lên màu sắc của tôi setttings nhưng không phải là một phần mẫu. Khi tôi nhìn vào ví dụ nó xuất hiện tất cả mọi thứ được nối đúng, nhưng mỗi khi tôi thường làm MVVM tôi sao chép toàn bộ ví dụ. Cảm ơn các ví dụ của bạn, tôi sẽ xem xét chúng. – djangojazz
@djangojazz WPF cho phép bạn chèn bất kỳ 'đối tượng' nào vào cây giao diện người dùng. Theo mặc định, WPF vẽ tất cả các mục mà nó không biết cách vẽ bằng 'TextBlock' hiển thị' .ToString() 'của đối tượng, tuy nhiên' DataTemplates' có thể được sử dụng để báo cho WPF biết cách render đối tượng. Ví dụ, thay đổi lệnh bấm menu của bạn thành 'dockchildren.Children.Add (new DataBoundMVVMChartViewModel());'. Bạn thường sẽ thấy một cái gì đó như "WPFTesting12_2.ViewModel.DataBoundMVVMChartViewModel" trong giao diện người dùng, tuy nhiên vì 'DataTemplate' của bạn trong' ', nó sẽ được vẽ bằng cách sử dụng' DataBoundMVVMChart' thay thế. –
Rachel
@djangojazz (Rất tiếc, tôi quên 'DockPanels' chỉ cho phép các đối tượng giao diện người dùng được thêm vào, vì vậy bạn cần sử dụng điều khiển cho phép bất kỳ đối tượng nào được thêm vào ví dụ trong nhận xét trên của tôi để hoạt động, chẳng hạn như '' hoặc '