WPF中a ControlTemplate
和a有什么区别DataTemplate
?
有人可以快速总结一下ViewModelLocator是什么,它是如何工作的,以及与DataTemplates相比使用它的优缺点是什么?
我曾尝试在Google上查找信息,但似乎有许多不同的实现,并没有关于它是什么以及使用它的优点/缺点的严格列表.
我有一个ListBox
绑定到ViewModel上的子集合.列表框项基于父ViewModel上的属性在datatemplate中设置样式:
<Style x:Key="curveSpeedNonConstantParameterCell">
<Style.Triggers>
<DataTrigger Binding="{Binding Path=DataContext.CurveSpeedMustBeSpecified,
ElementName=someParentElementWithReferenceToRootDataContext}"
Value="True">
<Setter Property="Control.Visibility" Value="Hidden"></Setter>
</DataTrigger>
</Style.Triggers>
</Style>
Run Code Online (Sandbox Code Playgroud)
我收到以下输出错误:
System.Windows.Data Error: 39 : BindingExpression path error:
'CurveSpeedMustBeSpecified' property not found on
'object' ''BindingListCollectionView' (HashCode=20467555)'.
BindingExpression:Path=DataContext.CurveSpeedMustBeSpecified;
DataItem='Grid' (Name='nonConstantCurveParametersGrid');
target element is 'TextBox' (Name='');
target property is 'NoTarget' (type 'Object')
Run Code Online (Sandbox Code Playgroud)
因此,如果我将绑定表达式更改为"Path=DataContext.CurrentItem.CurveSpeedMustBeSpecified"
它可以工作,但只要父用户控件的datacontext是a BindingListCollectionView
.这是不可接受的,因为用户控件的其余部分会自动绑定到CurrentItem
on的属性BindingList
.
如何在样式中指定绑定表达式,以便无论父数据上下文是集合视图还是单个项目,它都可以工作?
我想在WPF ItemsControl中显示Customer对象列表.我为此创建了一个DataTemplate:
<DataTemplate DataType="{x:Type myNameSpace:Customer}">
<StackPanel Orientation="Horizontal" Margin="10">
<CheckBox"></CheckBox>
<TextBlock Text="{Binding Path=Number}"></TextBlock>
<TextBlock Text=" - "></TextBlock>
<TextBlock Text="{Binding Path=Name}"></TextBlock>
</StackPanel>
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)
所以我想要的基本上是一个包含NUMBER - NAME的简单列表(带复选框).有没有办法可以在绑定部分直接连接数字和名称?
我正在尝试为winform互操作构建一个下拉列表,我正在创建代码中的下拉列表.但是,我在根据我指定的DataTemplate获取要绑定的数据时遇到问题.
我错过了什么?
drpCreditCardNumberWpf = new ComboBox();
DataTemplate cardLayout = new DataTemplate {DataType = typeof (CreditCardPayment)};
StackPanel sp = new StackPanel
{
Orientation = System.Windows.Controls.Orientation.Vertical
};
TextBlock cardHolder = new TextBlock {ToolTip = "Card Holder Name"};
cardHolder.SetBinding(TextBlock.TextProperty, "BillToName");
sp.Children.Add(cardHolder);
TextBlock cardNumber = new TextBlock {ToolTip = "Credit Card Number"};
cardNumber.SetBinding(TextBlock.TextProperty, "SafeNumber");
sp.Children.Add(cardNumber);
TextBlock notes = new TextBlock {ToolTip = "Notes"};
notes.SetBinding(TextBlock.TextProperty, "Notes");
sp.Children.Add(notes);
cardLayout.Resources.Add(sp, null);
drpCreditCardNumberWpf.ItemTemplate = cardLayout;
Run Code Online (Sandbox Code Playgroud) 我有一个ListBox
DataTemplate
WPF.我希望一个项目紧贴在左侧ListBox
,另一个项目紧靠右侧,但我无法弄清楚如何做到这一点.
到目前为止,我有一个Grid
有三列,左边和右边的列有内容,中心是占位符,宽度设置为"*".我哪里错了?
这是代码:
<DataTemplate x:Key="SmallCustomerListItem">
<Grid HorizontalAlignment="Stretch">
<Grid.RowDefinitions>
<RowDefinition/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition Width="*"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<WrapPanel HorizontalAlignment="Stretch" Margin="0">
<!--Some content here-->
<TextBlock Text="{Binding Path=LastName}" TextWrapping="Wrap" FontSize="24"/>
<TextBlock Text=", " TextWrapping="Wrap" FontSize="24"/>
<TextBlock Text="{Binding Path=FirstName}" TextWrapping="Wrap" FontSize="24"/>
</WrapPanel>
<ListBox ItemsSource="{Binding Path=PhoneNumbers}" Grid.Column="2" d:DesignWidth="100" d:DesignHeight="50"
Margin="8,0" Background="Transparent" BorderBrush="Transparent" IsHitTestVisible="False" HorizontalAlignment="Stretch"/>
</Grid>
</DataTemplate>
Run Code Online (Sandbox Code Playgroud) 我想知道人们如何处理没有项目的ListBox控件?例如,我想绑定搜索结果列表,但如果没有找到结果,我想显示"未找到结果".
我目前解决这个问题的方法是,如果结果集count = 0,我会隐藏列表框,并显示带有"找不到结果"消息的标签.理想情况下,我想要像ASP .NET datagrid EmptyTemplate解决方案.
干杯
是否有可能具有DataTemplate
组合或继承(类似于样式中的"BasedOn")?有两个我需要的实例.
对于继承的类:我有一个带有几个继承类的基类.我不想在每个派生类中复制基类模板DataTemplate
.
不同的视图:对于同一个类,我想定义一个datatemplate,然后根据需要添加到该模板.防爆.基本模板将显示对象中的数据,然后我想要不同的模板,可以对对象执行不同的操作,同时显示数据(继承基本模板).
以下DataTemplate.DataTrigger
使年龄显示为红色,如果它等于 30.
如果年龄显示大于 30,如何使年龄显示为红色?
<DataTemplate DataType="{x:Type local:Customer}">
<Grid x:Name="MainGrid" Style="{StaticResource customerGridMainStyle}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100"/>
<ColumnDefinition Width="150"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<TextBlock Grid.Column="0" Grid.Row="0" Text="First Name" Margin="5"/>
<TextBlock Grid.Column="1" Grid.Row="0" Text="{Binding FirstName}" Margin="5"/>
<TextBlock Grid.Column="0" Grid.Row="1" Text="Last Name" Margin="5"/>
<TextBlock Grid.Column="1" Grid.Row="1" Text="{Binding LastName}" Margin="5"/>
<TextBlock Grid.Column="0" Grid.Row="2" Text="Age" Margin="5"/>
<TextBlock x:Name="Age" Grid.Column="1" Grid.Row="2" Text="{Binding Age}" Margin="5"/>
</Grid>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding Path=Age}">
<DataTrigger.Value>30</DataTrigger.Value>
<Setter TargetName="Age" Property="Foreground" Value="Red"/>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
Run Code Online (Sandbox Code Playgroud) 我认为这是可能的,但显而易见的方法是行不通的.
目前,我这样做:
<ContentControl
Content="{Binding HurfView.EditedPart}">
<ContentControl.Resources>
<Style
TargetType="ContentControl"
x:Key="emptytemplate">
<Style.Triggers>
<DataTrigger
Binding="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=Content}"
Value="{x:Null}">
<Setter
Property="ContentControl.Template">
<Setter.Value>
<ControlTemplate>
<Grid
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch">
<TextBlock>EMPTY!</TextBlock>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</DataTrigger>
</Style.Triggers>
</Style>
</ContentControl.Resources>
</ContentControl>
Run Code Online (Sandbox Code Playgroud)
我没有得到任何绑定错误,这编译.但是,它不会产生预期的结果.我也试过了这个显而易见的事情:
<DataTemplate DataType="{x:Null}"><TextBlock>Hurf</TextBlock></DataTemplate>
Run Code Online (Sandbox Code Playgroud)
这不会编译.并且尝试两次设置内容也会失败:
<ContentControl
Content="{Binding HurfView.EditedPart}">
<TextBlock>DEFAULT DISPLAY</TextBlock>
</ContentControl>
Run Code Online (Sandbox Code Playgroud)
我可以不编写自定义模板选择器吗?
datatemplate ×10
wpf ×10
xaml ×3
.net ×2
listbox ×2
c# ×1
data-binding ×1
datatrigger ×1
layout ×1
mvvm ×1
mvvm-light ×1