【问题标题】:Caliburn Micro User Control Data ContextCaliburn Micro 用户控制数据上下文
【发布时间】:2018-01-16 23:30:43
【问题描述】:

我是 Caliburn Micro 的新手,所以我确定我在这里缺少一些简单的东西。

我有一个顶级的 Shell 视图:

<Window x:Class="LotRunPlotGrid.ShellView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:local="clr-namespace:LotRunPlotGrid.Views"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        >
    <Grid>
        <local:LotRunPlotGridView />
    </Grid>
</Window>

它是关联的视图模型:

namespace LotRunPlotGrid
{
    public class ShellViewModel : IShell {}
}

然后我有一个用户控件定义为:

<UserControl x:Class="LotRunPlotGrid.Views.LotRunPlotGridView"
             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:converter="clr-namespace:LotRunPlotGrid.Converters"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:vm="clr-namespace:LotRunPlotGrid.ViewModels"
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="900"
             d:DataContext="{d:DesignInstance Type=vm:LotRunPlotGridViewModel, IsDesignTimeCreatable=True}">
    <UserControl.Resources>
        <converter:LotRunItemValueToColorConverter x:Key="ColorConverter"/>
        <Style x:Key="LotRunButtonStyle" TargetType="Button">
            <Setter Property="Width" Value="Auto"/>
            <Setter Property="Height" Value="{Binding ActualWidth, RelativeSource={RelativeSource Self}}"/>
            <Setter Property="BorderBrush" Value="Black"/>
            <Setter Property="BorderThickness" Value="2"/>
            <Setter Property="FontFamily" Value="Segoe UI"/>
            <Setter Property="FontSize" Value="20"/>
            <Setter Property="FontWeight" Value="Bold"/>
            <Setter Property="Foreground" Value="Black"/>
            <Setter Property="Content" Value="{Binding LotID}"/>
        </Style>
    </UserControl.Resources>
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        <TextBlock Grid.Row ="0" Text="Lot Run Plot Grid View" FontSize="20" FontFamily="Segoe UI"/>
        <ItemsControl Grid.Row="1" ItemsSource="{Binding LotRunItemsCollection}" Margin="0,0,-200,0" HorizontalAlignment="Left" Width="893">
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <UniformGrid Columns="10"/>
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <Button x:Name="LotRunItemButton" Style="{StaticResource LotRunButtonStyle}">
                        <Button.Background>
                            <MultiBinding Converter="{StaticResource ColorConverter}">
                                <Binding Path="LotRunDataDisplayMode" />
                                <Binding Path="LotRunItemValue"/>
                            </MultiBinding>
                        </Button.Background>
                    </Button>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    </Grid>
</UserControl>

它是关联的视图模型 ....

using Caliburn.Micro;
using System.Collections.ObjectModel;

namespace LotRunPlotGrid.ViewModels
{
    public class LotRunPlotGridViewModel : PropertyChangedBase
    {
        private ObservableCollection<LotRunItem> _lotRunItemsCollection = new ObservableCollection<LotRunItem>();
        public ObservableCollection<LotRunItem> LotRunItemsCollection
        {
            get { return _lotRunItemsCollection; }
            set { _lotRunItemsCollection = value; }
        }

        private int _numDisplayedColumns;
        public int NumDisplayedColumns
        {
            get { return _numDisplayedColumns; }
            set { _numDisplayedColumns = value; }
        }

        private int _numDisplayedRows;
        public int NumDisplayedRows
        {
            get { return _numDisplayedRows; }
            set { _numDisplayedRows = value; }
        }

        private int _lotRunDataDisplayMode;
        public int LotRunDataDisplayMode
        {
            get { return _lotRunDataDisplayMode; }
            set { _lotRunDataDisplayMode = value; }
        }


        public LotRunPlotGridViewModel()
        {
            LotRunItemsCollection.Add(new LotRunItem() { LotId = "Lot1", LotRunItemValue = "55", LotRunItemColor = "#FF05579" });
            LotRunItemsCollection.Add(new LotRunItem() { LotId = "Lot2", LotRunItemValue = "45", LotRunItemColor = "#FF05579" });
            LotRunItemsCollection.Add(new LotRunItem() { LotId = "Lot3", LotRunItemValue = "35", LotRunItemColor = "#FF05579" });
            LotRunItemsCollection.Add(new LotRunItem() { LotId = "Lot4", LotRunItemValue = "25", LotRunItemColor = "#FF05579" });
            LotRunItemsCollection.Add(new LotRunItem() { LotId = "Lot5", LotRunItemValue = "15", LotRunItemColor = "#FF05579" });
        }
    }
}

我遇到的问题是项目控件没有显示,因为我收到一个绑定错误,指出在 ShellViewModel 中找不到 LotRunItemsCollection,当如上所示时,LotRunItemsCollection 是 LotRunPlotGridViewModel 的成员。

那么关于将 LotRunPlotGridViewModel 绑定到 LotRunPlotGridView 以便在正确的视图模型中找到 LotRunItemsCollection,我在这里遗漏了什么?

感谢您的帮助!

【问题讨论】:

  • 如有疑问,您可以随时添加&lt;Label Content="{Binding}"/&gt; 以尝试了解您的位置。或者,您可以在 VS2017 上使用 Live Visual Tree 调试您的 WPF 树,否则使用 snoopwpf.codeplex.com

标签: c# wpf caliburn.micro


【解决方案1】:

您收到该消息是因为控件没有具有该属性名称的支持数据上下文。

在 shell 视图模型中创建一个属性,如下所示

namespace LotRunPlotGrid
{
    public class ShellViewModel : PropertyChangedBase, IShell {
        private LotRunPlotGridViewModel myGrid = new LotRunPlotGridViewModel();

        public LotRunPlotGridViewModel MyGrid {
            get { return myGrid; }
            set {
                myGrid = value;
                NotifyOfPropertyChanged();
            }
        }
    }
}

然后在视图中您可以命名用户控件以匹配属性名称

<Window x:Class="LotRunPlotGrid.ShellView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:local="clr-namespace:LotRunPlotGrid.Views"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        >
    <Grid>
        <local:LotRunPlotGridView x:Name="MyGrid" />
    </Grid>
</Window>

框架将按照约定将MyGrid 属性绑定到local:LotRunPlotGridView 作为其数据上下文。

如果您不想将用户控件直接绑定到 shell,框架足够智能,可以根据绑定的视图模型查找视图。

例如,如果外壳有以下内容

<Window x:Class="LotRunPlotGrid.ShellView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        >
    <Grid>
        <ContentControl x:Name="MyGrid" />
    </Grid>
</Window>

请注意,本地命名空间已被删除。框架在绑定控件时会注意到内容为空,并使用命名约定搜索绑定属性的匹配视图。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-24
    • 2012-01-29
    • 2012-10-24
    • 2012-05-08
    • 1970-01-01
    相关资源
    最近更新 更多