当我使用ObservableCollection绑定菜单项时,只能点击MenuItem的"内部"区域:
alt text http://tanguay.info/web/external/mvvmMenuItems.png
在我的视图中我有这个菜单:
<Menu>
<MenuItem
Header="Options" ItemsSource="{Binding ManageMenuPageItemViewModels}"
ItemTemplate="{StaticResource MainMenuTemplate}"/>
</Menu>
Run Code Online (Sandbox Code Playgroud)
然后我用这个DataTemplate绑定它:
<DataTemplate x:Key="MainMenuTemplate">
<MenuItem
Header="{Binding Title}"
Command="{Binding DataContext.SwitchPageCommand,
RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Menu}}}"
Background="Red"
CommandParameter="{Binding IdCode}"/>
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)
由于ObservableCollection ManageMenuPageItemViewModels中的每个ViewModel 都有一个属性Title和IdCode,因此上面的代码一见即可.
但是,问题是DataTemplate 中的MenuItem实际上在另一个MenuItem中(就像它被绑定两次一样),因此在上面的DataTemplate中,Background ="Red",每个菜单项中都有一个Red框,只有这个区域可以单击,而不是整个菜单项区域本身(例如,如果用户点击复选标记所在的区域或内部可点击区域的右侧或左侧,则没有任何反应,如果您没有单独的颜色很混乱.)
将MenuItems绑定到ViewModel的ObservableCollection的正确方法是什么,以便每个MenuItem中的整个区域都是可点击的?
所以我根据下面的建议进行了以下更改,现在有了这个:
alt text http://tanguay.info/web/external/mvvmMenuItemsYellow.png
我只有我的DataTemplate中TextBlock的,但我还是不能"色全菜单项",但只是将TextBlock:
<DataTemplate x:Key="MainMenuTemplate">
<TextBlock Text="{Binding Title}"/>
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)
我将Command绑定到Menu.ItemContainerStyle,但它们现在不会触发:
<Menu DockPanel.Dock="Top">
<Menu.ItemContainerStyle>
<Style TargetType="MenuItem">
<Setter Property="Background" Value="Yellow"/>
<Setter …
Run Code Online (Sandbox Code Playgroud) 好吧,这是一个令人尴尬的简单问题,但让我发疯.我正在学习DataTemplating,并且我正在尝试将非常简单的ItemTemplate应用于ListBox.
但是,当我运行我的应用程序时,模板完全被忽略,我只是得到标准的列表框,而实际上我希望看到一个带有'Test'的复选框列表.
我已经尝试过几次并且总是一样的结果.我在Google上查了几个资源,并且在ListBox上都有相同的语法定义和ItemTemplate,所以我真的看不出我出错的地方.
码...
<Grid x:Name="LayoutRoot">
<ListBox x:Name="TestList"
SelectionMode="Multiple">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<CheckBox Content="Check this checkbox!"/>
<TextBlock>Test</TextBlock>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
<ListBox.Items>
<ListBoxItem>Bob</ListBoxItem>
<ListBoxItem>Jim</ListBoxItem>
<ListBoxItem>Dave</ListBoxItem>
<ListBoxItem>Larry</ListBoxItem>
<ListBoxItem>Tom</ListBoxItem>
</ListBox.Items>
</ListBox>
</Grid>
Run Code Online (Sandbox Code Playgroud)
任何帮助非常感谢.抱歉这样一个看似愚蠢的问题,但我真的堕落在这里的第一个障碍:(
在
我有一个非常简单的WPF应用程序,它显示一个ComboBox,它绑定到代表人的类列表.每个'Person'对象都有一个Name字符串字段和一个Sex enum.我希望ComboBox显示各种人物名称字段的下拉列表,但是根据性别字段对每一行进行样式设置,例如,蓝色表示男性,粉红色表示女性.谁能告诉我我做错了什么?
这是XML:
<Window x:Class="ComboBoxColour.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<StackPanel Orientation="Vertical">
<ComboBox ItemsSource="{Binding People}" Width="100" Height="20">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBlock Name="somePerson" Text="{Binding Path=Name}">
<TextBlock.Triggers>
<DataTrigger Binding="{Binding Path=Sex}" Value="Male">
<DataTrigger.Setters>
<Setter Property="Foreground" Value="Blue" TargetName="somePerson" />
</DataTrigger.Setters>
</DataTrigger>
</TextBlock.Triggers>
</TextBlock>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
</StackPanel>
</Window>
Run Code Online (Sandbox Code Playgroud)
这是C#:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Collections.ObjectModel;
namespace ComboBoxColour
{
/// <summary>
/// Interaction logic …
Run Code Online (Sandbox Code Playgroud) 我有一个绑定到任务的项控件.每个任务都有任务状态.我为每个任务状态定义了不同的数据模板,还为数据模板选择器定义
问题是,当动态更改任务状态时,我无法弄清楚如何触发数据模板选择器.
我想知道如何将数据触发器与数据模板一起使用.
如果这不会成功,我将探索其他替代方案,例如
1.附加属性绑定到任务状态.任何更改都将动态设置数据模板.
2.视觉状态管理器
我想做一些非常简单的事情.我有一个绑定到bool的ToggleButton.IsChecked属性.我希望背景在红色(假)和绿色(真实)之间切换.但由于某种原因,它似乎是在红色和无背景之间切换.我使用转换器来检查我是否从源获得正确的通知我是,所以不确定为什么一个触发器(假/红色)工作而另一个(真/绿色)不起作用.还想听听人们如何调试这类问题.谢谢!
这是代码.
<DataTemplate x:Name"Flipper">
<StackPanel>
...
<ToggleButton IsChecked="{Binding Path=BoolValue,
Converter={StaticResource converter}}"
Name="onoff" >
</ToggleButton>
...
<StackPanel>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding ElementName=onoff,Path=IsChecked}"
Value="True">
<Setter TargetName="onoff" Property="Background" Value="Green"/>
</DataTrigger>
<DataTrigger Binding="{Binding ElementName=onoff,Path=IsChecked}"
Value="False">
<Setter TargetName="onoff" Property="Background" Value="Red"/>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)
更新:我将togglebutton更改为一个复选框,它可以工作.不明白为什么......
我有一个数据对象 - 一个名为的自定义类Notification
- 公开一个IsCritical
属性.这个想法是,如果通知到期,它有一段有效期,应该引起用户的注意.
想象一下这个测试数据的场景:
_source = new[] {
new Notification { Text = "Just thought you should know" },
new Notification { Text = "Quick, run!", IsCritical = true },
};
Run Code Online (Sandbox Code Playgroud)
第二项应出现在ItemsControl
具有脉冲背景的情况下.这是一个简单的数据模板摘录,显示了我想要动画灰色和黄色背景的方法.
<DataTemplate DataType="Notification">
<Border CornerRadius="5" Background="#DDD">
<Border.Triggers>
<EventTrigger RoutedEvent="Border.Loaded">
<BeginStoryboard>
<Storyboard>
<ColorAnimation
Storyboard.TargetProperty="Background.Color"
From="#DDD" To="#FF0" Duration="0:0:0.7"
AutoReverse="True" RepeatBehavior="Forever" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Border.Triggers>
<ContentPresenter Content="{TemplateBinding Content}" />
</Border>
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)
我不确定的是如何使这个动画以值的形式为条件IsCritical
.如果绑定值为false
,#DDD
则应保留默认的背景颜色.
如何创建一个DataTemplate
代码(使用C#),然后添加一个控件DataTemplate
?
<data:DataGrid.RowDetailsTemplate>
<DataTemplate>
<Border>
<Border Margin="10" Padding="10" BorderBrush="SteelBlue"
BorderThickness="3" CornerRadius="5">
<TextBlock Text="{Binding Description}" TextWrapping="Wrap"
FontSize="10">
</TextBlock>
</Border>
</Border>
</DataTemplate>
</data:DataGrid.RowDetailsTemplate>
Run Code Online (Sandbox Code Playgroud)
我正在使用Sivlerlight.
我有以下......
<ComboBox Grid.Row="2" Grid.Column="2" Grid.RowSpan="2" ItemsSource="{Binding ShipperAddresses}" Text="{Binding ShipperAddress}" Margin="85,2,0,2">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBox AcceptsReturn="True" Width="200" Height="100"/>
<DataTemplate.Resources>
<Style TargetType="{x:Type TextBox}">
<Setter Property="IsReadOnly" Value="True">
<Style.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type GroupBox}}, Path=Tag}" Value="False"/>
</Style.Triggers>
</Setter>
</Style>
</DataTemplate.Resources>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
Run Code Online (Sandbox Code Playgroud)
问题是你不能像我想在DataTemplate中那样应用Style.Trigger.所以我的问题是你将如何应用创建一个触发器,以便DataTemplate上的属性根据父级更改?
最终解决方案:
我拿了Souvik给我的东西并修好了,因为有一些问题.这是最终结果.
<ComboBox Grid.Row="2" Grid.Column="2" Grid.RowSpan="2" ItemsSource="{Binding ShipperAddresses}" Text="{Binding ShipperAddress}" DisplayMemberPath="Value" Margin="85,2,0,2">
<ComboBox.ItemTemplate>
<DataTemplate>
<TextBox AcceptsReturn="True" Width="200" Height="100" Text="{Binding Path=Value}"/>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ComboBox}}, Path=IsEditable}" Value="False">
<Setter Property="IsEnabled" Value="False"/>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
</ComboBox.ItemTemplate>
<ComboBox.Resources>
<Style TargetType="{x:Type ComboBox}"> …
Run Code Online (Sandbox Code Playgroud) 像ListView这样的ASP.NET控件允许通过设置ListView.EmptyDataTemplate属性来提供自定义模板,此模板将在空数据源的情况下呈现.
如何在基于ItemsControl的控件(如ListView和DataGrid)中使用WPF(仅限XAML)?因此,我希望在ItemsSource为空时显示我的自定义DataTemplate .
我在使用TextWrapping在此示例中工作时遇到问题.谁能看到我在这里错了什么?
<ListView Name="listViewReportedException" ItemsSource="{Binding ExceptionDetails}">
<ListView.View>
<GridView>
<GridViewColumn Header="Time" DisplayMemberBinding="{Binding Thrown}" Width="150" />
<GridViewColumn Header="Description" DisplayMemberBinding="{Binding Description}" Width="385">
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBlock TextWrapping="Wrap" Text="{Binding}" Width="385"/>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
<GridViewColumn Header="Recover action" DisplayMemberBinding="{Binding Action}" Width="90"/>
</GridView>
</ListView.View>
</ListView>
Run Code Online (Sandbox Code Playgroud) datatemplate ×10
wpf ×9
triggers ×3
xaml ×3
c# ×2
.net ×1
animation ×1
combobox ×1
datagrid ×1
itemscontrol ×1
itemtemplate ×1
listbox ×1
menuitem ×1
mvvm ×1
silverlight ×1
styling ×1
templating ×1
textblock ×1
word-wrap ×1