如何显示WPF绑定的所选项目

时间:2017-03-31 10:37:25

标签: wpf

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。

2 个答案:

答案 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无法显示LabelImage或其DataTemplate中的任何元素。

IsEditable的{​​{1}}属性设置为ComboBox,它应该按预期工作,即false将在{{1}时应用于所选项目关闭:

DataTemplate

您的问题与MVVM无关......