有人可以详细说明ControlTemplate和DataTemplatewpf 之间的区别吗?
在自定义控件的情况下应该使用什么?比如一个StackPanel可能有一个image和一个TextBox?
在某些使用"Content"属性定义自定义控件的情况下,这似乎令人困惑.
如果能够提供如何在不同场景中使用每个场景的示例,那将是很好的.
我有一个ListBox,它使用DataTemplate显示对象.DataTemplate包含一个TextBox.当用户选择ListBox中的项目时,我想将焦点设置为所选项目的TextBox.
我已经能够通过处理ListBox.SelectionChanged来部分实现这一点,但它仅在用户单击ListBox以选择项时才有效 - 如果用户选中ListBox并使用箭头键选择项,则它不起作用即使TextBox.Focus()被调用.
当用户使用键盘选择项目时,如何将焦点设置到TextBox?
这是ListBox的标记:
<ListBox Name="lb1" SelectionChanged="ListBox_SelectionChanged" ItemsSource="{Binding Items}" >
<ListBox.ItemTemplate>
<DataTemplate >
<TextBox></TextBox>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Run Code Online (Sandbox Code Playgroud)
这是处理代码:
private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
ListBoxItem lbi = (ListBoxItem)this.lb1.ItemContainerGenerator.ContainerFromItem(this.lb1.SelectedItem);
Visual v = GetDescendantByType<TextBox>(lbi);
TextBox tb = (TextBox)v;
tb.Focus();
}
Run Code Online (Sandbox Code Playgroud) 在使用MVVM的过去,我已经创建了每个View作为DataTemplate其对应的viewmodel来处理连接它们.我刚开始使用MVVM Light,并注意到他们有ViewModelLocator.我看过的其他几个工具包包含了一些变化,但这会带来什么好处DataTemplate呢?
连接Views和ViewModel的最佳做法是什么?
我刚刚掌握数据绑定,我正在努力绑定到嵌套在对象下方的ObservableCollection中的属性,即在ListView的DataTemplate中我试图绑定到下面的Day.DayDate属性.
它是一个日记应用程序,这是它的结构(编辑,以保持简短):
public class Month : INotifyPropertyChanged
{
public DateTime StartDate { get; set; }
public ObservableCollection<Day> Days { get; set; }
}
public class Day : INotifyPropertyChanged
{
public DateTime DayDate { get; set; }
public ObservableCollection<Gig> Gigs { get; set; }
}
public class Gig : INotifyPropertyChanged
{
// Properties of a gig
}
Run Code Online (Sandbox Code Playgroud)
我最初填充像这样的月份日:
private void InitMonth(Month calendarMonth)
{
// create a Day Object for each day of month, create a gig for each booking on that …Run Code Online (Sandbox Code Playgroud) 这是一个简单的问题:您将视图链接到视图模型的用途是什么?
基本上有两种常见的方法来实现,数据模板和视图模型注入(下面的示例).
我想知道的是为什么你喜欢一种方法而不是另一种方法,在这种情况下你使用它们.精确您使用的MVVM框架.
数据模板方式或"View Model first"方法(Resources.xaml):
<DataTemplate DataType="{x:Type my:PersonViewModel}">
<my:PersonView/>
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)
视图模型注入方式或"查看第一"方法(PersonView.xaml.cs):
[Import]
public PersonViewModel ViewModel
{
set
{
this.DataContext = value;
}
}
Run Code Online (Sandbox Code Playgroud) <DataTemplate>
<TextBlock x:Name="Txt" Text="{Binding fieldA}" />
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)
我想以编程方式完成相应的上述XAML(XAML还有更多,我只显示了相关的位).到目前为止我有:
DataTemplate newDataTemplate = new DataTemplate();
TextBlock newTextBlock = new TextBlock();
newTextBlock.SetBinding(TextBlock.TextProperty, new Binding("fieldA"));
newTextBlock.Name = "txt";
Run Code Online (Sandbox Code Playgroud)
那么我现在如何将TextBlock添加到DataTemplate ...即我想做类似的事情:
newDataTemplate.children.Add(TextBlock)
Run Code Online (Sandbox Code Playgroud) 我有一个基本上像这样设置的视图:
<Grid>
<ViewBox>
<Grid>
<ItemsControl ItemsSource="{Binding MyItems}"
ItemTemplate="{Binding Source={StaticResource MyItemsDataTemplate}}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Grid />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
</Grid>
</ViewBox>
</Grid>
Run Code Online (Sandbox Code Playgroud)
这里使用的DataTemplate可以简化为:
<DataTemplate x:Key="AreaItemDisplayDataTemplate">
<Canvas Grid.ZIndex={Binding Z}>
<Grid>
// an shape is displayed here...
</Grid>
</Canvas>
Run Code Online (Sandbox Code Playgroud)
我现在希望ZIndex绑定到各个项目的Z属性.当我调试代码时,我也可以看到,当我期望它时,访问Z属性getter(每当我为它举起propertychanged事件时),所以我假设绑定工作正常.
但是,ZIndex没有按预期工作.绑定到该值对实际显示的Z Order没有影响.这个代码我哪里错了?
有人知道如何从使用DataTemplate作为列表框项的列表框中删除默认突出显示颜色吗?
当我使用ControlTemplate作为我的列表框项样式时,我可以删除样式ok.
我有一个ViewModel,我在其中创建了一个bool DisplaySummary属性.如果是这样,SummaryView则使用a来渲染ViewModel,否则DatailedView使用a.
我对如何从这里开始表示怀疑:
<DataTemplate DataType="{x:Type vm:AwesomeViewModel}">
<ContentControl Content="{Binding}">
<ContentControl.Style>
<Style>
#### WHAT I SHOULD PUT HERE?
</Style>
</ContentControl.Style>
</ContentControl>
</DataTemplate>
<DataTemplate x:Key="SummaryTemplate">
<vw:SummaryViewScreen />
</DataTemplate>
<DataTemplate x:Key="DetailedTemplate">
<vw:DetailedViewScreen />
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)
编辑:起初我尝试使用DataTemplateSelector,但由于它没有响应PropertyChanged,我不得不使用DataTriggers.
我正在尝试使用FrameworkElementFactory在代码中设置listbox的数据模板,我在数据模板中有一个复选框,我只需要设置复选框的字体大小.
这是代码.
FrameworkElementFactory Name = new FrameworkElementFactory(typeof(CheckBox));
Name.SetBinding(CheckBox.ContentProperty, new Binding("Content"));
Name.SetBinding(CheckBox.IsCheckedProperty, new Binding("BooleanValue"));
Name.SetValue(CheckBox.FontSizeProperty, 20);
stackpnl.AppendChild(columnName);
Run Code Online (Sandbox Code Playgroud)
在这段代码中,我无法设置FontSizeProperty.
出现异常,显示消息20不是字体大小的有效值.
如果此处出现问题,请更正此代码.提前致谢
datatemplate ×10
wpf ×10
c# ×3
mvvm ×3
xaml ×2
binding ×1
data-binding ×1
datatrigger ×1
focus ×1
listbox ×1
listboxitem ×1
listview ×1
viewmodel ×1