Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将UserControl的DataContext绑定到子ViewModel_C#_Wpf_Mvvm_Data Binding_User Controls - Fatal编程技术网

C# 将UserControl的DataContext绑定到子ViewModel

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

我是WPF和MVVM的新手。目前正在使用MVVM模式构建WPF应用程序,但很快就被多个MVVM卡住了

基本上我有一个主窗口,主窗口上有一个UserControl。它是一个简单的用户控件,只包含一个图像控件和一个滚动条。如下图所示:

<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();