C# 在WPF的代码隐藏中为列表框创建ItemTemplate-第二部分
我把这个问题命名为我的第二部分,因为我已经问了一个类似但更简单的问题,关于在WPF中为ListBox创建ItemTemplat 现在我要展开我的问题。我想要一个ListBox的ItemTemplate,这样就可以使用它来绑定或不绑定到ObservableCollection 如果我不想将ItemsSource绑定到ObservableCollection,我将使用以下代码:C# 在WPF的代码隐藏中为列表框创建ItemTemplate-第二部分,c#,wpf,listbox,itemtemplate,C#,Wpf,Listbox,Itemtemplate,我把这个问题命名为我的第二部分,因为我已经问了一个类似但更简单的问题,关于在WPF中为ListBox创建ItemTemplat 现在我要展开我的问题。我想要一个ListBox的ItemTemplate,这样就可以使用它来绑定或不绑定到ObservableCollection 如果我不想将ItemsSource绑定到ObservableCollection,我将使用以下代码: var textBlockFactory = new FrameworkElementFactory(typeof(Tex
var textBlockFactory = new FrameworkElementFactory(typeof(TextBlock));
textBlockFactory.SetValue(TextBlock.TextProperty, new Binding(".")); // Here
textBlockFactory.SetValue(TextBlock.BackgroundProperty, Brushes.Red);
textBlockFactory.SetValue(TextBlock.ForegroundProperty, Brushes.Wheat);
textBlockFactory.SetValue(TextBlock.FontSizeProperty, 18.0);
var template = new DataTemplate();
template.VisualTree = textBlockFactory;
MyListBox.ItemTemplate = template;
但它不适用于ItemsSource绑定到ObservableCollection,因为TextBlock.TextProperty必须绑定到DisplayMemberPath属性
抱歉语法错误。首先,您需要创建一个变量来确定状态:您使用的是集合,还是字符串数组。此标志也可以是依赖项属性,在我的示例中,它是SomeFlag: 对于测试,添加SelectionChanged事件的处理程序: 下面是一个完整的示例: XAML
首先,您需要创建一个变量来确定状态:您使用的是一个集合,或者只是一个字符串数组。此标志也可以是依赖项属性,在我的示例中,它是SomeFlag: 对于测试,添加SelectionChanged事件的处理程序: 下面是一个完整的示例: XAML
实际上,它必须绑定到内容。[DisplayMemberPath]。但是,我想在不同的情况下使用这个自定义列表框。即使我没有任何DisplayMemberPath,只显示字符串列表。@user3530012:因为TextBlock.TextProperty必须绑定到DisplayMemberPath属性。-您能详细描述一下吗?我正在创建一个从listbox继承的customcontrol。我将在我的项目中使用我自己的customcontrol。因此,我需要能够将其itemssource绑定到ObservableCollection,并为其设置DisplayMemberPath。也许我只想使用customcontrol只显示一个字符串数组。在这种情况下,我甚至不需要为它设置DisplayMemberPath。如果我还不清楚,请告诉我。实际上它必须绑定到内容。[DisplayMemberPath]。但是,我想在不同的情况下使用这个自定义列表框。即使我没有任何DisplayMemberPath,只显示字符串列表。@user3530012:因为TextBlock.TextProperty必须绑定到DisplayMemberPath属性。-您能详细描述一下吗?我正在创建一个从listbox继承的customcontrol。我将在我的项目中使用我自己的customcontrol。因此,我需要能够将其itemssource绑定到ObservableCollection,并为其设置DisplayMemberPath。也许我只想使用customcontrol只显示一个字符串数组。在这种情况下,我甚至不需要为它设置DisplayMemberPath。如果我还不清楚,请告诉我。
private void Window_Loaded(object sender, RoutedEventArgs e)
{
bool SomeFlag = false;
if (SomeFlag == false)
{
var textBlockFactory = new FrameworkElementFactory(typeof(TextBlock));
textBlockFactory.SetValue(TextBlock.TextProperty, new Binding("."));
textBlockFactory.SetValue(TextBlock.BackgroundProperty, Brushes.Red);
textBlockFactory.SetValue(TextBlock.ForegroundProperty, Brushes.Wheat);
textBlockFactory.SetValue(TextBlock.FontSizeProperty, 18.0);
var template = new DataTemplate();
template.VisualTree = textBlockFactory;
MyListBox.ItemTemplate = template;
}
else
{
MyListBox.DisplayMemberPath = "Name";
MyListBox.SelectedValuePath = "Age";
}
}
private void MyListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
System.Diagnostics.Debug.WriteLine("SelectedValue is " + MyListBox.SelectedValue);
}
<Grid>
<ListBox Name="MyListBox"
SelectionChanged="MyListBox_SelectionChanged"
ItemsSource="{Binding Path=MyCollection}" />
</Grid>
public partial class MainWindow : Window
{
ViewModel MyViewModel = new ViewModel();
public MainWindow()
{
InitializeComponent();
this.DataContext = MyViewModel;
MyViewModel.MyCollection = new ObservableCollection<Person>();
MyViewModel.MyCollection.Add(new Person()
{
Age = 22,
Name = "Nick",
});
MyViewModel.MyCollection.Add(new Person()
{
Age = 11,
Name = "Sam",
});
MyViewModel.MyCollection.Add(new Person()
{
Name = "Kate",
Age = 15,
});
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
bool SomeFlag = false;
if (SomeFlag == false)
{
var textBlockFactory = new FrameworkElementFactory(typeof(TextBlock));
textBlockFactory.SetValue(TextBlock.TextProperty, new Binding("."));
textBlockFactory.SetValue(TextBlock.BackgroundProperty, Brushes.Red);
textBlockFactory.SetValue(TextBlock.ForegroundProperty, Brushes.Wheat);
textBlockFactory.SetValue(TextBlock.FontSizeProperty, 18.0);
var template = new DataTemplate();
template.VisualTree = textBlockFactory;
MyListBox.ItemTemplate = template;
}
else
{
MyListBox.DisplayMemberPath = "Name";
MyListBox.SelectedValuePath = "Age";
}
}
private void MyListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
System.Diagnostics.Debug.WriteLine("SelectedValue is " + MyListBox.SelectedValue);
}
}
public class ViewModel : NotificationObject
{
#region MyCollection
public ObservableCollection<Person> MyCollection
{
get;
set;
}
#endregion
}
#region Model
public class Person
{
public string Name
{
get;
set;
}
public int Age
{
get;
set;
}
}
#endregion
#region NotificationObject
public class NotificationObject : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void NotifyPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
#endregion