首先这是一个用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
浙公网安备 33010602011771号