首先这是一个用Caliburn.Micro写的一个项目,具体代码如下:

View:

<TabControl x:Name="Items" BorderBrush="#FFC2C2C2">
                    <TabControl.ItemTemplate>
                        <DataTemplate>
                            <StackPanel Orientation="Horizontal">
                                <TextBlock Text="{Binding DisplayName}" Margin="5,0,0,0" />
                                <Button Tag="{Binding BtnNum1}" x:Name="BtnRemove" Height="14" Width="14" Margin="5,0,0,0"   Content="×" >
                                    
                                    <i:Interaction.Triggers>
                                        <i:EventTrigger EventName="Click">
                                            <CM:ActionMessage MethodName="BtnRemove">
                                                <CM:Parameter Value="{Binding ItemsSource,ElementName=Items}"></CM:Parameter>
                                                <CM:Parameter Value="{Binding Tag,ElementName=BtnRemove}"></CM:Parameter>
                                            </CM:ActionMessage>
                                        </i:EventTrigger>

                                    </i:Interaction.Triggers>
                                </Button>
                            </StackPanel>
                        </DataTemplate>
                    </TabControl.ItemTemplate>
                </TabControl>
<Button CM:Message.Attach="[Event Click] = [Action Forecast(‘选项卡名称’)]" Content="增加" Width="100" Height="30" Margin="10,0,0,0"/>

如果用的framwork,则TabControl的Name(后台自动帮你绑定ItemSource)可以更改,但是用的Cailburn.Micro能更改,但是isselect不会不选中,这里用的第二种,所以就没有改Name

ViewModel:

public class Desktop1ViewModel : Conductor<IScreen>.Collection.OneActive

引用Conductor<IScreen>.Collection.OneActive基类(包含PropertyChangedBase类,所以不必担心数据不能更新)。

添加下列方法,

    int asd = 0;
        public void Forecast(string Header)
        {
            ActivateItem(new AutoStationViewModel
            {
                DisplayName = Header,
                BtnNum1 = asd
            });
            asd++;
        }

定义asd是为了移除做准备,Header可以后台自己设置或者前台传值。BtnNum1是你需要打开的用户控件Viewmodel定义的一个函数。现在不管,DisPlayName则是该类封装的方法。

UserControl:

<StackPanel Orientation="Horizontal">
        <TextBlock Text="这是个view "/>
        <TextBlock x:Name="DisplayName" />
        <TextBlock Text="." />
    </StackPanel>

  UserControlVieModel:

public class AutoStationViewModel : Screen
    {

        private int _BtnNum1;
        public int BtnNum1
        {
            get { return _BtnNum1; }
            set
            {
                _BtnNum1 = value; NotifyOfPropertyChange(() => BtnNum1);
            }
        }
public void BtnRemove(object asd,object BtnNum)
        {
            IObservableCollection<IScreen> Items = asd as IObservableCollection<IScreen>;
            int q = int.Parse(BtnNum1.ToString());
            Items.RemoveAt(q);
        }

这里很奇怪的是为什么我把BtnRemove写在了UserControl里面,而CM寻找确实在MainView里面,根据CM的命名匹配原则,肯定不可能啊,但是这里用了ISCEEN类,他会把包括DisplayName等等东西全部转移到UserControlViewModel里面,所以他所寻找的方法会去找UserControl。

 posted on 2016-07-20 18:21  Hi!Bro!  阅读(924)  评论(0)    收藏  举报