C# 将UserControl的DataContext绑定到子ViewModel
我是WPF和MVVM的新手。目前正在使用MVVM模式构建WPF应用程序,但很快就被多个MVVM卡住了 基本上我有一个主窗口,主窗口上有一个UserControl。它是一个简单的用户控件,只包含一个图像控件和一个滚动条。如下图所示:C# 将UserControl的DataContext绑定到子ViewModel,c#,wpf,mvvm,data-binding,user-controls,C#,Wpf,Mvvm,Data Binding,User Controls,我是WPF和MVVM的新手。目前正在使用MVVM模式构建WPF应用程序,但很快就被多个MVVM卡住了 基本上我有一个主窗口,主窗口上有一个UserControl。它是一个简单的用户控件,只包含一个图像控件和一个滚动条。如下图所示: <UserControl x:Class="AutomaticContourEvaluation_WURO_WPF.Views.TwoDImageControl" xmlns="http://schemas.microsoft.com/winf
<UserControl x:Class="AutomaticContourEvaluation_WURO_WPF.Views.TwoDImageControl"
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:AutomaticContourEvaluation_WURO_WPF.Views"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Image Grid.Column="0" Source="{Binding Path=CurrentSlice}" x:Name="sliceDisplayControl" />
<ScrollBar Grid.Column="1" Minimum="0" Maximum="{Binding Path=NumberOfSlices, FallbackValue=10}" Value="{Binding Path=SliceIndex, Mode=TwoWay, FallbackValue=0}" x:Name="sliceSelectionScrollBar" Margin="0,0,0,0"/>
</Grid>
为了获得UserControl(TwoDSliceControl)工作的绑定,我在MainWindow.xaml中设置了UserControl的DataContext,如下所示:
<Window ...>
<Window.DataContext>
<viewModel:MainWindowViewModel />
</Window.DataContext>
...
<control:TwoDImageControl x:Name="twoDSliceImageControl" DataContext="{Binding Path=TwoDModuleViewModel}" />
...
</Window>
...
...
我的UserControl(TwoDSliceControl)是特定于ViewModel的,所以我选择这种方式,而不是使用依赖属性。但是绑定失败了。您可以在我的代码中看到,我在实例化TwoDSliceViewModel时创建了一些演示数据,但这些虚拟数据没有显示出来
我使用了断点来发现在主窗口成功初始化之后,TwoDSliceControl的DataContext设置得很好。但是TwoDSliceControl中ImageControl的源属性和TwoDSliceControl中滚动条的MaxValue属性为null
我觉得这行XAML代码:
<control:TwoDImageControl x:Name="twoDSliceImageControl" DataContext="{Binding Path=TwoDModuleViewModel}" />
实际上,首先初始化twoDSliceImageControl,然后设置twoDSliceImageControl.DataContext属性。初始化时,twoDSliceImageControl.DataContext为null,因此twoDSliceImageControl内的绑定失败。虽然初始化后,twoDSliceImageControl.DataContext设置良好,但UserControl中的绑定不会刷新,并且仍然为null
有解决这个问题的方法吗?已经被困了一段时间,没有找到合适的解决方案。谢谢大家 谢谢大家。我终于发现了。 这些代码行似乎有一些问题:
BitmapImage demoImage = new BitmapImage();
demoImage.UriSource = new Uri("2Ddemo.jpg", UriKind.Relative);
demoImage.CacheOption = BitmapCacheOption.OnLoad;
相反,我需要使用BitmapImage.BeginInit()和BitmapImage.EndInit()来包装BitmapImage创建
因此,工作代码是:
BitmapImage demoImage = new BitmapImage();
demoImage.BeginInit();
demoImage.UriSource = new Uri("2Ddemo.jpg", UriKind.Relative);
demoImage.CacheOption = BitmapCacheOption.OnLoad;
demoImage.EndInit();
实际上,装订并没有什么问题 您的代码乍一看应该可以工作。如何将MainWindowViewModel分配给窗口的DataContext,包含控件:TwoDImageControl?@AntonDanylov我已经更新了我的帖子,以反映MainWindowViewModel的分配。将此帖子中的诊断添加到您的DataContext绑定中,它将告诉您如何查找值以及值是什么。@S.Jiang:看起来非常正确,绑定错误确实会有所帮助。
BitmapImage demoImage = new BitmapImage();
demoImage.UriSource = new Uri("2Ddemo.jpg", UriKind.Relative);
demoImage.CacheOption = BitmapCacheOption.OnLoad;
BitmapImage demoImage = new BitmapImage();
demoImage.BeginInit();
demoImage.UriSource = new Uri("2Ddemo.jpg", UriKind.Relative);
demoImage.CacheOption = BitmapCacheOption.OnLoad;
demoImage.EndInit();