我有一個選項卡式部分,我試圖連接關閉和動態打開新選項卡的命令。問題是我不能理解如何綁定我的tabItem模板(它有一個按鈕)的命令。下面是代碼:從樣式模板中綁定按鈕命令
(含有標籤部分的,簡化的用戶控件..):
<UserControl.DataContext>
<vm:InicioViewModel />
</UserControl.DataContext>
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="../Visual Resources/TabResource.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>
<ContentPresenter HorizontalAlignment="Stretch" Grid.Column="1">
<ContentPresenter.Content>
<TabControl Name="tc">
<TabControl.DataContext>
<vm:WorkSpaceViewModel/>
</TabControl.DataContext>
<TabControl ItemsSource="{Binding Items}"/>
</TabControl>
</ContentPresenter.Content>
</ContentPresenter>
</Grid>
(這裏是爲TabItem的資源字典):
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type TabItem}">
<Border x:Name="TaBorder" Width="auto" Height="auto"
BorderBrush="LightGray"
BorderThickness="0.5,0.5,0.5,0"
CornerRadius="3,3,0,0"
Background="WhiteSmoke">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="20" />
</Grid.ColumnDefinitions>
<TextBlock Margin="2" Grid.Column="0" Text="{TemplateBinding Header}" />
<Button x:Name="CloseButton" Grid.Column="1" Width="11" Height="11"
VerticalAlignment="Center"
HorizontalAlignment="Center"
Background="Transparent"
DataContext="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type TabControl}}, Path=DataContext}"
Command="{Binding CloseWorkSpaceCommand}"
(Donkt know what yo put in command to reference my viewmodel Icommand)
BorderThickness="0"
>
<!-- ETC -->
(Here my viewModel):
class InicioViewModel : ViewModelBase
{
private WorkSpaceViewModel _workSpaceVm;
public InicioViewModel()
{
}
public WorkSpaceViewModel WorkSpaceVm
{
get { return _workSpaceVm; }
set { _workSpaceVm = value; }
}
}
(WorkSpaceViewModel ..):
public class WorkSpaceViewModel
{
private ObservableCollection<IWorkSpaceItemVm> _items;
private RelayCommand _closeWorkSpaceCommand;
public WorkSpaceViewModel()
{
_items = new ObservableCollection<IWorkSpaceItemVm>();
}
public ObservableCollection<IWorkSpaceItemVm> Items
{
get { return _items; }
set { _items = value; }
}
public ICommand CloseWorkSpaceCommand
{
get
{
return _closeWorkSpaceCommand ?? (_closeWorkSpaceCommand = new RelayCommand(
param => CloseWorkSpace_Execute(param),
param => CloseWorkSpace_CanExecute(param)
));
}
}
private void CloseWorkSpace_Execute(object parm)
{
MessageBox.Show("asdasdasd");
}
private bool CloseWorkSpace_CanExecute(object parm)
{
return true;
}
}
正如你可以注意到我只有CloseWorkSpace_Execute顯示用於測試目的一個消息。
1)我如何從我的tabItem樣式模板中引用我的viewmodel中的Icommand,或者如果有更好的方法使用相同的結果將會受到歡迎。
2)爲什麼當我運行應用程序創建一個空的選項卡,我有我的觀察集合列表爲空
編輯: 的RelayCommand是工作在程序的其他部分確定,那不是問題, tabItem被渲染成可以觸發工作和所有,我仍然不能讓我的頭腦如何從我的viewmodel綁定命令與我製作的模板tabItem。
編輯2: 該命令現在正在工作,顯然該命令無法在資源字典中識別,並標記爲:「在對象類型的DataContext中不能識別屬性'CloseWorkSpaceCommand'」,但設置按鈕的DataContext爲: DataContext =「{Binding RelativeSource = {RelativeSource FindAncestor,AncestorType = {x:Type TabControl}},Path = DataContext}」 運行應用程序時完成工作(Visual Studio仍然道歉DataContext類型,不知道它是什麼手段)。 默認情況下還有一個選項卡,爲什麼? 是否有一種方法來糾正與DataContext類型的代碼氣味?
乍一看,似乎你的困難可能與安置模板e放在單獨的資源字典中,使訪問任何你想綁定的東西變得不那麼方便。想到的一種可能的解決方案是在同一個XAML文件中聲明一個合適的'Command'並綁定到該文件,然後在別處建立一個綁定(例如'CommandBinding')來響應該命令。但是,這裏有太多的代碼可以肯定地知道模糊問題的哪一部分給你帶來麻煩,沒關係花費時間來解決問題。 –
請編輯,以便只包含可靠地再現問題的[良好,_minimal_,_complete_代碼示例](https://stackoverflow.com/help/mcve)。 –
嘿,彼得,我編輯它,我不明白你在說什麼,你說問題是資源字典聲明的參考?,那麼,相對資源是什麼?有另一種方法可以實現這一目標嗎?我想綁定一個命令到樣式模板中的按鈕,無論我是否必須在模板中聲明,內聯在我的用戶或我的tabcontrol資源中,但我不知道如何引用我在tabItem模板中創建的按鈕 –