UserControl 上的 DataGrid 不显示绑定的 ObservableCollection
DataGrid on UserControl doesn't display binded ObservableCollection
我有一个带有一些加载集合的按钮的主窗口:
<Window x:Class="GUI.MainWindow.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:mainWindowViewModel="clr-namespace:GUI.MainWindow"
xmlns:s="clr-namespace:Helpers"
xmlns:configuration="clr-namespace:GUI.Configuration"
xmlns:results="clr-namespace:GUI.Results"
mc:Ignorable="d"
Title="{Binding Path=Model.Title}"
Width="Auto"
WindowStartupLocation="CenterScreen">
<Window.Resources>
<DataTemplate DataType="{x:Type results:ResultViewModel}">
<results:ResultView/>
</DataTemplate>
</Window.Resources>
<!--DataContext-->
<Window.DataContext>
<mainWindowViewModel:MainWindowViewModel />
</Window.DataContext>
<!--DataContext-->
<!--Main Grid-->
<Grid Name="MainGrid"
Margin="5"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="8*" />
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<!--Tabs-->
<TabControl Grid.Row="1"
Grid.RowSpan="2"
Grid.Column="0"
VerticalAlignment="Stretch">
<!--Result View-->
<TabItem Header="{Binding Model.TabImportHeader}">
<ContentControl Content="{Binding ResultViewModel}"/>
</TabItem>
</TabControl>
<!--Tabs-->
<!--Buttons-->
<Grid Grid.Row="2">
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Button Grid.Row="0"
Grid.Column="0"
Margin="10"
Height="25"
Width="150"
Content="Load"
Command="{Binding LoadCommand}" />
<Button Grid.Row="0"
Grid.Column="2"
Margin="10"
Height="25"
Width="150"
Content="Reload"
Command="{Binding ReloadCommand}" />
</Grid>
<!--Buttons-->
</Grid>
<!--Main Grid-->
</Window>
然后我有一个 UserControl,它应该显示加载的集合,但什么也没显示。
<UserControl x:Class="GUI.Results.ResultView"
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:GUI.Results"
mc:Ignorable="d">
<UserControl.DataContext>
<local:ResultViewModel />
</UserControl.DataContext>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="87*" />
<ColumnDefinition Width="415*" />
<ColumnDefinition Width="501*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<DataGrid Grid.Column="0"
Grid.ColumnSpan="3"
Grid.Row="0"
ItemsSource="{Binding Model.Collections}"
ColumnWidth="*"
AutoGenerateColumns="false"
HorizontalAlignment="Stretch"
IsReadOnly="True">
<DataGrid.Resources>
<Style TargetType="DataGridColumnHeader">
<Setter Property="HorizontalContentAlignment"
Value="Center" />
</Style>
</DataGrid.Resources>
<DataGrid.Columns>
<DataGridTextColumn Header="Filename"
Binding="{Binding ResultInfo.Filename}"
Width="Auto" />
<DataGridTextColumn Header="Score 1"
Binding="{Binding ResultInfo.Score1, StringFormat=F4, ConverterCulture=de-DE}"
Width="Auto" />
<DataGridTextColumn Header="Score 2"
Binding="{Binding ResultInfo.Score2, StringFormat=F4, ConverterCulture=de-DE}"
Width="Auto" />
<DataGridTextColumn Header="Score 3"
Binding="{Binding ResultInfo.Score3, StringFormat=F4, ConverterCulture=de-DE}"
Width="Auto" />
<DataGridTextColumn Header="Score 4"
Binding="{Binding ResultInfo.Score4, StringFormat=F4, ConverterCulture=de-DE}"
Width="Auto" />
<DataGridTextColumn Header="SaMP"
Binding="{Binding ResultInfo.SaMP}"
Width="Auto" />
<DataGridTextColumn Header="Spig"
Binding="{Binding ResultInfo.Spig}"
Width="Auto" />
<DataGridTextColumn Header="Ppig"
Binding="{Binding ResultInfo.Ppig, StringFormat=00.0##\%}"
Width="Auto" />
<DataGridTextColumn Header="Pigment3"
Binding="{Binding ResultInfo.Pigment3}"
Width="Auto" />
<DataGridTextColumn Header="Pigment4"
Binding="{Binding ResultInfo.Pigment4}"
Width="Auto" />
<DataGridTextColumn Header="ZQ1"
Binding="{Binding ResultInfo.ZQ1}"
Width="Auto" />
<DataGridTextColumn Header="ZQ2"
Binding="{Binding ResultInfo.ZQ2}"
Width="Auto" />
<DataGridTextColumn Header="ZQ3"
Binding="{Binding ResultInfo.ZQ3}"
Width="Auto" />
<DataGridTextColumn Header="ZQ4"
Binding="{Binding ResultInfo.ZQ4}"
Width="Auto" />
<DataGridTextColumn Header="Message"
Binding="{Binding ResultInfo.Message}"
Width="Auto" />
<DataGridTextColumn Header="Distance"
Binding="{Binding ResultInfo.PowDistance, StringFormat=F2, ConverterCulture=de-DE}"
Width="Auto" />
</DataGrid.Columns>
</DataGrid>
</Grid>
</UserControl>
这里是我如何将数据放入集合中(如果我调试,值就在那里):
Application.Current.Dispatcher.Invoke(() => MainWindowViewModel.ResultViewModel.Model.Collections.Add(Collection));
Collections
是 ObservableCollection<> 的类型;
似乎我在绑定中遗漏了一些东西,但我对 WPF 和 MVVM 很陌生,但我没有找到它。
我已经阅读了有关 DependencyProperty 的内容,但我想为我的 userControl 创建一个 ViewModel,因为它最终会变得更加复杂。
非常感谢任何帮助。
您有两个 ResultViewModel
实例,一个在 MainWindowViewModel.ResultViewModel
属性 中,另一个直接分配给 UserControl 的 DataContext:
<UserControl.DataContext>
<local:ResultViewModel />
</UserControl.DataContext>
从 UserControl 的 XAML.
中删除以上内容
一般来说,UserControl 永远不应该有它的 "own" 视图模型,你永远不应该在它的 XAML 或代码后面显式地设置它的 DataContext 属性。这样做会覆盖继承的 DataContext 的值,它包含正确的 ResultViewModel 实例。
我有一个带有一些加载集合的按钮的主窗口:
<Window x:Class="GUI.MainWindow.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:mainWindowViewModel="clr-namespace:GUI.MainWindow"
xmlns:s="clr-namespace:Helpers"
xmlns:configuration="clr-namespace:GUI.Configuration"
xmlns:results="clr-namespace:GUI.Results"
mc:Ignorable="d"
Title="{Binding Path=Model.Title}"
Width="Auto"
WindowStartupLocation="CenterScreen">
<Window.Resources>
<DataTemplate DataType="{x:Type results:ResultViewModel}">
<results:ResultView/>
</DataTemplate>
</Window.Resources>
<!--DataContext-->
<Window.DataContext>
<mainWindowViewModel:MainWindowViewModel />
</Window.DataContext>
<!--DataContext-->
<!--Main Grid-->
<Grid Name="MainGrid"
Margin="5"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="8*" />
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<!--Tabs-->
<TabControl Grid.Row="1"
Grid.RowSpan="2"
Grid.Column="0"
VerticalAlignment="Stretch">
<!--Result View-->
<TabItem Header="{Binding Model.TabImportHeader}">
<ContentControl Content="{Binding ResultViewModel}"/>
</TabItem>
</TabControl>
<!--Tabs-->
<!--Buttons-->
<Grid Grid.Row="2">
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Button Grid.Row="0"
Grid.Column="0"
Margin="10"
Height="25"
Width="150"
Content="Load"
Command="{Binding LoadCommand}" />
<Button Grid.Row="0"
Grid.Column="2"
Margin="10"
Height="25"
Width="150"
Content="Reload"
Command="{Binding ReloadCommand}" />
</Grid>
<!--Buttons-->
</Grid>
<!--Main Grid-->
</Window>
然后我有一个 UserControl,它应该显示加载的集合,但什么也没显示。
<UserControl x:Class="GUI.Results.ResultView"
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:GUI.Results"
mc:Ignorable="d">
<UserControl.DataContext>
<local:ResultViewModel />
</UserControl.DataContext>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="87*" />
<ColumnDefinition Width="415*" />
<ColumnDefinition Width="501*" />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="*" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<DataGrid Grid.Column="0"
Grid.ColumnSpan="3"
Grid.Row="0"
ItemsSource="{Binding Model.Collections}"
ColumnWidth="*"
AutoGenerateColumns="false"
HorizontalAlignment="Stretch"
IsReadOnly="True">
<DataGrid.Resources>
<Style TargetType="DataGridColumnHeader">
<Setter Property="HorizontalContentAlignment"
Value="Center" />
</Style>
</DataGrid.Resources>
<DataGrid.Columns>
<DataGridTextColumn Header="Filename"
Binding="{Binding ResultInfo.Filename}"
Width="Auto" />
<DataGridTextColumn Header="Score 1"
Binding="{Binding ResultInfo.Score1, StringFormat=F4, ConverterCulture=de-DE}"
Width="Auto" />
<DataGridTextColumn Header="Score 2"
Binding="{Binding ResultInfo.Score2, StringFormat=F4, ConverterCulture=de-DE}"
Width="Auto" />
<DataGridTextColumn Header="Score 3"
Binding="{Binding ResultInfo.Score3, StringFormat=F4, ConverterCulture=de-DE}"
Width="Auto" />
<DataGridTextColumn Header="Score 4"
Binding="{Binding ResultInfo.Score4, StringFormat=F4, ConverterCulture=de-DE}"
Width="Auto" />
<DataGridTextColumn Header="SaMP"
Binding="{Binding ResultInfo.SaMP}"
Width="Auto" />
<DataGridTextColumn Header="Spig"
Binding="{Binding ResultInfo.Spig}"
Width="Auto" />
<DataGridTextColumn Header="Ppig"
Binding="{Binding ResultInfo.Ppig, StringFormat=00.0##\%}"
Width="Auto" />
<DataGridTextColumn Header="Pigment3"
Binding="{Binding ResultInfo.Pigment3}"
Width="Auto" />
<DataGridTextColumn Header="Pigment4"
Binding="{Binding ResultInfo.Pigment4}"
Width="Auto" />
<DataGridTextColumn Header="ZQ1"
Binding="{Binding ResultInfo.ZQ1}"
Width="Auto" />
<DataGridTextColumn Header="ZQ2"
Binding="{Binding ResultInfo.ZQ2}"
Width="Auto" />
<DataGridTextColumn Header="ZQ3"
Binding="{Binding ResultInfo.ZQ3}"
Width="Auto" />
<DataGridTextColumn Header="ZQ4"
Binding="{Binding ResultInfo.ZQ4}"
Width="Auto" />
<DataGridTextColumn Header="Message"
Binding="{Binding ResultInfo.Message}"
Width="Auto" />
<DataGridTextColumn Header="Distance"
Binding="{Binding ResultInfo.PowDistance, StringFormat=F2, ConverterCulture=de-DE}"
Width="Auto" />
</DataGrid.Columns>
</DataGrid>
</Grid>
</UserControl>
这里是我如何将数据放入集合中(如果我调试,值就在那里):
Application.Current.Dispatcher.Invoke(() => MainWindowViewModel.ResultViewModel.Model.Collections.Add(Collection));
Collections
是 ObservableCollection<> 的类型;
似乎我在绑定中遗漏了一些东西,但我对 WPF 和 MVVM 很陌生,但我没有找到它。 我已经阅读了有关 DependencyProperty 的内容,但我想为我的 userControl 创建一个 ViewModel,因为它最终会变得更加复杂。
非常感谢任何帮助。
您有两个 ResultViewModel
实例,一个在 MainWindowViewModel.ResultViewModel
属性 中,另一个直接分配给 UserControl 的 DataContext:
<UserControl.DataContext>
<local:ResultViewModel />
</UserControl.DataContext>
从 UserControl 的 XAML.
中删除以上内容一般来说,UserControl 永远不应该有它的 "own" 视图模型,你永远不应该在它的 XAML 或代码后面显式地设置它的 DataContext 属性。这样做会覆盖继承的 DataContext 的值,它包含正确的 ResultViewModel 实例。