【问题标题】:ItemControl not binding objects correctlyItemsControl 没有正确绑定对象
【发布时间】:2012-03-26 09:06:15
【问题描述】:

我有一个包含 ItemControl 标记的 XAML 页面(应用程序使用 MVVM 轻框架):

<ItemsControl MinWidth="100" MinHeight="25" ItemsSource="{Binding Path=Options}" HorizontalAlignment="Left" d:LayoutOverrides="Height" Margin="10,0">
     <ItemsControl.ItemsPanel>
          <ItemsPanelTemplate>
               <WrapPanel Orientation="Horizontal" />
          </ItemsPanelTemplate>
     </ItemsControl.ItemsPanel>

此控件有一个项目源,它是选项对象的列表。本项控件的数据模板如下:

<DataTemplate DataType="{x:Type Sales:Option}">
     <local:SalesOptionButton d:LayoutOverrides="Width, Height" DataContext="{Binding}"/>
</DataTemplate>

我有一个与 SalesOptionButton 控件关联的视图模型,如下所示:

公共类 SalesOptionButton { 私有字符串_name; 私有选项_Option;

    public ICommand SelectedOptionButtonCommand { get; set; }

    public string Name
    {
        get { return _name; }
        set { SetStructPropertyValue(ref _name, value); }
    }

    public Option Option
    {
        get { return _scriptOption; }
        set { SetPropertyValue(ref _scriptOption, value); }
    }

    public SalesScriptOptionButton(ScriptOption option)
    {
        Option = option;
        Name = option.OptionText;
    }

    protected override void RegisterForMessages()
    {
        SelectedOptionButtonCommand = new RelayCommand(OptionButtonSelected);
    }

    private void OptionButtonSelected()
    {
        MessengerService.Send(ScriptOptionSelectedMessage.Create(ScriptOption));
    }

    protected override void SetDesignTimeInfo(){}
}

这是选项控件的 XAML:

<UserControl [INCLUDES]>
    <Button Height="25" Padding="1" MinWidth="100" Content="{Binding Name}" Command="{Binding SelectedOptionButtonCommand}"/>
</UserControl>

这样做的目的是,为数据源中的每个选项创建一个按钮。这些按钮应显示选项的名称,并在单击按钮时向将处理该单击的主应用程序发送一条消息(设置选择的选项)。

我看到的问题是正在创建按钮,但没有绑定其他任何东西(按钮上没有显示选项名称,并且按钮单击不起作用)。谁能告诉我为什么这不像我认为的那样工作?

【问题讨论】:

  • 你在哪里定义的:&lt;DataTemplate DataType="{x:Type Sales:Option}"&gt;

标签: c# wpf mvvm-light wcf-binding


【解决方案1】:

您没有将数据模板设置为项目控件的属性。

<ItemsControl ItemTemplate={StaticResource OptionTemplate} .../>

<DataTemplate x:Key="OptionTemplate" DataType="{x:Type Sales:Option}">
     <local:SalesOptionButton d:LayoutOverrides="Width, Height" DataContext="{Binding}"/>
</DataTemplate>

【讨论】:

  • 其实你不需要。他们已经指定了类型,并且 ItemControl 应该在不需要明确指定模板的情况下接受它。
  • 这不起作用。我收到以下异常:找不到名为“OptionTemplate”的资源。资源名称区分大小写。
  • 你可能是对的,但我发现明确表示更安全。我想看看 Options 属性的定义。
  • @Matt Burland:你是对的,它告诉我这个名字可以忽略不计。但如果是这样的话,那我的代码有什么问题呢?
  • @Phil:有点跑题了,但我至少可以想到一种情况,你不想明确表示,那就是你有一个异构的对象类型集合,你每个人都有不同的模板。但是,在这种情况下,它肯定不会受到伤害。
【解决方案2】:

当代码的点点滴滴似乎丢失时,很难破译您的帖子。你说:

此控件有一个项目源,它是选项对象的列表。本项控件的数据模板如下:

<DataTemplate DataType="{x:Type Sales:Option}">
    <local:SalesOptionButton d:LayoutOverrides="Width, Height" DataContext="{Binding}"/>
</DataTemplate>

您还没有向我们展示您的 Option 课程 - 只有您的 SalesOptionButton 课程。大概,您的 Option 类型有一些属性可以产生关联的 SalesOptionButton 实例?如果是这样,那么您的数据模板在这里是错误的:

<local:SalesOptionButton d:LayoutOverrides="Width, Height" DataContext="{Binding}"/>

您将SalesOptionButton 的DataContext 设置为Option 实例,而不是SalesOptionButton 实例。我猜(而且我必须)你想要这样的东西:

<local:SalesOptionButton d:LayoutOverrides="Width, Height" DataContext="{Binding SalesOptionButton}"/>

【讨论】:

    猜你喜欢
    • 2019-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-04
    • 2019-04-14
    • 1970-01-01
    • 2015-09-08
    • 1970-01-01
    相关资源
    最近更新 更多