关于选项卡和组合框的2个快速WPF(Windows演示基础)问题

时间:2010-02-19 12:23:41

标签: c# wpf wpf-controls wpftoolkit binding

我是一名非常新手的WPF程序员,所以在一些简单的任务中需要帮助。

1-如图所示,我想要(+)标签(它是一个用TabItem创建的标签,或者它应该是按钮还是别的?: - /)来创建一个标签,比如说( A1),再次按下,应该创建(A2),类似于选项卡式浏览器.........如果可能,按( - )删除用户提示上的选定选项卡。

alt text http://img191.imageshack.us/img191/4532/tabn.png

2-我希望,该用户在文本框中输入文本,内容用逗号或分号分隔,并且该内容被添加到按钮上的COMBOBOX按下/单击,我想,它需要某种数据绑定?不确定,..这样,到最后,来自文本框的内容成为ComboBox中的列表(在按钮上).................... 如果可能的话,在文本框中选择文本,按钮单击(选择相同或不同的按钮,将文本框内容添加到组合框),它会从文本框和组合框中删除相同的文本。

请帮助,我正在学习WPF,但需要这个紧急帮助,我目前对它的了解无法解决。谢谢。

2 个答案:

答案 0 :(得分:2)

使用数据绑定和MVVM,一切都变得更容易。起初更难,但最终更容易。

制作两个实施Item的课程ItemCollectionINotifyPropertyChangedItem应该公开字符串Text属性,而ItemCollection应该公开ObservableCollection<Item> Items属性和Item SelectedItem属性。

ItemCollection类的构造函数使用测试数据填充Items并设置SelectedItem

在实际开始实现制表符控件之前,这似乎要做很多事情,但相信我,你会喜欢这个结果。 TabControl的XAML看起来像这样:

<TabControl
    ItemsSource="{Binding Items}"
    SelectedItem="{Binding SelectedItem}">
    <TabControl.DataContext>
        <local:ItemsCollection/>
    </TabControl.DataContext>
    <TabControl.Resources>
        <DataTemplate DataType="{x:Type local:Item}">
            <TextBlock Background="AliceBlue" Text="{Binding Text}"/>
        </DataTemplate>
    </TabControl.Resources>
    <TabControl.ItemContainerStyle>
        <Style TargetType="{x:Type TabItem}">
            <Style.Setters>
                <Setter Property="Header" Value="{Binding Text}"/>
            </Style.Setters>
        </Style>
    </TabControl.ItemContainerStyle>
</TabControl>

让我们理解这是做什么的。它会创建一个TabControl。它会创建一个ItemsCollection对象,并将其设置为TabControl的{​​{1}}。您已将DataContext绑定到ItemSource,因此Items会为每个项目创建TabControl。它会将TabItem应用于每个ItemContainerStyle,将TabItem属性设置为Header的{​​{1}}属性。

当控件呈现选项卡的内容时,它会找到要呈现的项目,搜索资源以查找Item与项目匹配的Text,并使用该模板。由于我们在DataTemplate中定义了一个,因此您可以获得漂亮的蓝色背景和DataType属性。

这似乎要经历很多事情。但是现在您不必编写任何操作UI的代码;你只需编写操纵你TabControl.Resources的代码,而UI几乎可以自行处理。

现在让我们来处理添加新标签。我们要做的是向控件添加一个新项,当它被选中时,会向Text集合中添加一个新项。

创建一个名为oh ItemsCollection的新类。它来自Items。修改您的ControlItem构造函数,使其添加的最后一项是Item,而不是ItemsCollection。并让它将该项目的ControlItem属性设置为“+”。

将此方法添加到Item

Text

现在添加到您窗口的代码隐藏中,并添加为ItemsCollection的{​​{1}}事件处理程序:

public Item AddItem()
{
    Item newItem = new Item {Text = "New item"};
    Items.Insert(Items.Count-1, newItem);
    return newItem;
}

您可以实现类似的逻辑来从列表中删除项目,但是您需要向SelectionChanged引入另一个变量来跟踪之前选择的项目,以便您可以知道要删除的项目。

您可以做的另一件事:在TabControl中实施void TabControl_SelectionChanged(object sender, RoutedEventArgs e) { TabControl tc = (TabControl) sender; if (tc.SelectedItem is ControlItem) { ItemsCollection ic = (ItemsCollection) tc.DataContext; tc.SelectedItem = ic.AddItem(); } } 属性,并为ItemsCollection的{​​{1}} Background属性添加一个setter它。然后,您可以在Item中重载该属性,以便您的添加和删除选项卡看起来不同。

您还可以为控件项实现不同的子类,并让它们公开您在ItemContainerStyle事件处理程序中调用的方法。这样,事件处理程序不必知道被单击的控件项目正在做什么。事实上,如果你将方法作为TabItem的一部分,除非它被覆盖,否则它不会做任何事情,窗口甚至不需要知道Background 子类。

简而言之,这就是MVVM的理念:将视图绑定到它几乎不知道的对象。让视图模型对象控制发生的事情,以便视图不必。

答案 1 :(得分:0)

标签控件应该很简单。在+选项卡上处理Click事件,创建一个新选项卡并使其成为活动选项卡。应该很容易......我必须运行,所以现在无法向您显示代码答案。试一试,回过头来解决任何问题。

下一部分我可以提供更多帮助

<StackPanel>
            <TextBox x:Name="txtOptions" TextChanged="OnTextChanged"></TextBox>
            <ComboBox x:Name="cboSelect" ItemsSource="{Binding Path=Options}"/>
        </StackPanel>

代码隐藏窗口(或您的类)必须实现INotifyPropertyChanged。还要将窗口的DataContext属性设置为自身(例如在ctor中),如this.DataContext = this;

public partial class Window1 : Window, INotifyPropertyChanged
   {
       string[] _options;
       public string[] Options
       {
           get
           {  return _options;         }
           set
           {
               _options = value;
               if (this.PropertyChanged != null)
                   this.PropertyChanged(this, new PropertyChangedEventArgs("Options"));
           }
       }

文本更改事件处理程序修改代码隐藏的Options属性并触发已修改属性的通知。 Combobox会收到通知,因为它是绑定到该属性并自行更新的数据。

private void OnTextChanged(object sender, TextChangedEventArgs e)
      {
          this.Options = txtOptions.Text.Split(';');
      }