C#:
public void SetCompetition(Window wT1)
{
//Add all the Copetition
wT1._competition = new List<Competition>();
wT1._competition.Add(new Competition { Logo = "3.png", Name = "test1", IsSelected = false });
wT1._competition.Add(new Competition { Logo = "3.png", Name = "test2", IsSelected = false });
wT1._competition.Add(new Competition { Logo = "3.png", Name = "test3", IsSelected = false });
wT1._competition.Add(new Competition { Logo = "3.png", Name = "test4", IsSelected = false });
wT1.cboSetupCompetition.ItemsSource = wT1._competition;
wT1.cboSetupCompetition.Items.Refresh();
}
数据模板:
<UserControl.Resources>
<System:Double x:Key="Double1">11</System:Double>
<DataTemplate x:Key="cmbCompetition">
<WrapPanel Height="30" >
<Label Content="{Binding Name}" ></Label>
</WrapPanel>
</DataTemplate>
</UserControl.Resources>
<ComboBox x:Name="cboSetupCompetition" ItemTemplate="{DynamicResource cmbCompetition}" HorizontalAlignment="Left" Margin="29,28,0,0" VerticalAlignment="Top" Width="173" RenderTransformOrigin="0.5,0.591" FontSize="12" Height="22" IsEditable="True" Background="#FFD8D8D8" SelectionChanged="UpdateCompetitionSelection"/>
我有一个带有标签和图像的Combobox,当我选择一个项目时,我想在Combobox关闭时看到相同的格式。我没有得到任何错误我看到application.Competition(这是我的对象模型)的名称,而不是图像和标签的值。
加载应用程序时调用SetCopetition。
答案 0 :(得分:1)
发现Mn8的具体问题是IsEditable=true
强制组合将文本框显示为所选项目
然而,您仍然认为winforms不是WPF,使用后面的代码将数据链接到视图会导致许多问题和不稳定性,因为这通常会打破绑定连接,这是最初您怀疑的问题,使用适当的MVVM方法将消除所有这些问题
我所知道的最好的MVVM是
https://msdn.microsoft.com/en-gb/library/hh848246.aspx
<强>模型强>
这是您的数据层,它处理数据的存储和访问,您的模型将处理对文件,数据库,服务等的访问
一个简单的模型将是
public class Model
{
public string Text { get; set; }
public Uri Uri { get; set; }
}
<强>视图模型强>
在您的模型之上,您拥有自己的视图模型 这可以管理View与模型的交互 例如,因为它使用Prism的BindableBase,SetProperty方法通知View对数据的任何更改,ObservableCollection自动通知集合的更改,它还使用Prism的DelegateCommand来允许方法绑定图
public class ViewModel:BindableBase
{
public ViewModel()
{
AddItem = new DelegateCommand(() => Collection.Add(new Model()
{
Text = NewText,
Uri = new Uri(NewUri)
}));
}
private string _NewText;
public string NewText
{
get { return _NewText; }
set { SetProperty(ref _NewText, value); }
}
private string _NewUri;
public string NewUri
{
get { return _NewUri; }
set { SetProperty(ref _NewUri, value); }
}
private Model _SelectedItem;
public Model SelectedItem
{
get { return _SelectedItem; }
set
{
if (SetProperty(ref _SelectedItem, value))
{
NewText = value?.Text;
NewUri = value?.Uri.ToString();
}
}
}
public ObservableCollection<Model> Collection { get; } = new ObservableCollection<Model>();
public DelegateCommand AddItem { get; set; }
}
查看强>
View理想情况下除了显示和收集数据之外什么都不做,所有格式化/样式都应该在这里完成
首先你需要定义数据源,通常的方式是通过数据上下文,因为这个auto继承了可视树,在这个例子中因为我设置了窗口的datacontext,我也为它设置了它在窗口中唯一的例外是dataTempplate,因为它被设置为集合中的当前项
然后我将属性绑定到数据源注意文件后面的代码只是默认构造函数,根本没有其他代码
<Window
x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApplication1"
Title="MainWindow" Height="350" Width="525">
<Window.DataContext>
<local:ViewModel/>
</Window.DataContext>
<StackPanel>
<GroupBox Header="Text">
<TextBox Text="{Binding NewText}"/>
</GroupBox>
<GroupBox Header="URI">
<TextBox Text="{Binding NewUri}"/>
</GroupBox>
<Button Content="Add" Command="{Binding AddItem}"/>
<ComboBox ItemsSource="{Binding Collection}" SelectedItem="{Binding SelectedItem}">
<ComboBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<Image Source="{Binding Uri}" />
<TextBlock Text="{Binding Text}"/>
</StackPanel>
</DataTemplate>
</ComboBox.ItemTemplate>
</ComboBox>
</StackPanel>
</Window>
答案 1 :(得分:1)
TextBox
无法显示Label
和Image
或其DataTemplate
中的任何元素。
将IsEditable
的{{1}}属性设置为ComboBox
,它应该按预期工作,即false
将在{{1}时应用于所选项目关闭:
DataTemplate
您的问题与MVVM无关......