2011-01-24 132 views
0

好了,我已经创建了两个东西,一个MainWindowViewModel和TabControlViewModel。在我的TabControlViewModel内,我的视图基本上是一个带3个Tabitems的TabControl(Welcome/tabItem1/tabItem2)。WPF绑定用户控制

我的目标是当应用程序启动时,我只看到欢迎选项卡,然后当我选择文件 - >打开双方的TabItems变得可见,并重点展示我tabItem2显示文本文件的内容。

MainWindow.Xaml

<Menu DockPanel.Dock="Top" Width="Auto" Height="25" Name="Menu1"> 
       <MenuItem Header="_File" VerticalContentAlignment="Top" > 
        <MenuItem Header="_New" Command="{Binding NewCommand}" /> 
        <MenuItem Header="_Open" Command="{Binding OpenCommand}"> 

TabControlViewModel.cs

class TabControlViewModel : TabContainer 
{ 

    private DelegateCommand openCommand; 
    public ICommand OpenCommand 
    { 
     get 
     { 
      if (openCommand == null) 
       openCommand = new DelegateCommand(Open); 
      return openCommand; 
     } 
    } 

    private void Open(object obj) 
    { 
     ProcessOpenCommand(); 
    } 

    private void ProcessOpenCommand() 
    { 
     if (dataChanged) 
     { 
      SaveFirst(); 
      ShowOpenDialog(); 

     } 
     else 
     { 
      ShowOpenDialog(); 

     } 
    } 

    private void ShowOpenDialog() 
    { 
     System.Windows.Forms.OpenFileDialog ofd = new System.Windows.Forms.OpenFileDialog(); 
     ofd.Filter = "Text File (*.txt)|*.txt"; 

     if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK) 
     { 
      filePath = ofd.FileName; 
      ReadFile(filePath); 
      SetTitle(ofd.SafeFileName); 
      RuleTab.Focus(); 
     } 
    } 

    private string SaveFirst() 
    { 
     MessageBoxResult mbr = System.Windows.MessageBox.Show("Do you want to save changes?", "Save Changes", MessageBoxButton.YesNoCancel, MessageBoxImage.Warning); 

     if (mbr == MessageBoxResult.Yes) 
     { 
      if (filePath != null) 
      { 
       SaveFile(filePath); 
      } 
      else 
      { 
       ProcessSaveCommand(); 
      } 
     } 
     else if (mbr == MessageBoxResult.Cancel) 
     { 
      return "Cancel"; 
     } 
     return "Nothing"; 
    } 

我想我最大的问题是,应我的菜单命令,在这个TabControlViewModel或在我的MainWindowViewModel?您的耐心在这里的乡亲... :)

回答

0

非常感谢您能使用的DependencyProperty some tutorial 后来绑定到它就像你正在做的默认控件自定义的控制和创造ItemsSource属性。

代码为您MyTabControl(我假设只是在InitializeComponent后产生的所有选项卡 - 在XAML中创建的,所以如果你是addind任何新的后,你需要更新属性):

public partial class MyTabControl 
{ 
    public static readonly DependencyProperty ItemsProperty = 
     DependencyProperty.Register(
     "Items", 
     typeof(IEnumerable), 
     typeof(MyTabControl), 
     null); 

    public IEnumerable Items 
    { 
     get { return (IEnumerable)GetValue(ItemsProperty); } 
     set { SetValue(ItemsProperty, value); } 
    } 

    public MyTabControl() 
    { 
     InitializeComponent(); 
     Items = tabControl.Items; 
    } 
} 

此代码将在没有任何问题的情况下工作,但是在某些时候,对于您在mvvm上投入一些时间是值得的,因为在许多情况下它更容易。

+0

我上周读了这篇文章(不同的链接),并花了很长时间试图让它起作用。如果你可以发布一些代码,会非常感激。 – 2011-01-24 21:00:31

0

如果使用MVVM光框架(http://mvvmlight.codeplex.com/)你可以有控制1个广播消息,当一个项目被双击。然后让控件2订阅该类型的消息。当它收到消息时,它可以将Datacontext设置为正确的值。这当然假设你正在使用mvvm,并且每个usercontrol都有它自己的viewmodel。

广播代码可能是这个样子:

public class MainViewModel 
{ 
    public RelayCommand myCommand { get; private set; } 
    public MainViewModel() 
    { 
     myCommand = new RelayCommand(() => SendTheMessage()); 
    } 
    public void SendTheMessage() 
    { 
     Messenger.Default.Send("I have sent the message"); 
    } 
} 

到接收器的代码看起来是这样的:

public class myModel 
    { 
     public myModel() 
     { 
      Messenger.Default.Register<string>(this, DoSomething); 
     } 

     public void DoSomething(string item) 
     { 
      System.Windows.MessageBox.Show(item); 
     } 
    } 
+0

基于事物我读了我确定有必要在MVVM模型中构建这种类型的应用程序...对于我的口径初学者来说似乎很复杂。非常感谢 – 2011-01-24 22:09:59

0

我一直在视图模型阅读起来不认为这是我的简单应用程序所必需的。

你几乎肯定是这里错了。

事实上,如果您使用的是视图模型,那么您在这里尝试执行的操作非常简单:不是对控件之间的相互关系进行编码,而是生成视图模型对象的集合,这两个视图模型对象都是选项卡的ItemsSource控制和列表框。

如果要双击列表框中的某个项目来执行某些操作,以影响标签控件中出现的内容,请在视图模型中实施一个命令并双击该项目执行该命令。该命令执行后,会对视图模型做出任何更改,更改的属性会引发事件,并且选项卡控件中的显示会发生更改。

这不仅是你可以编写单元测试(这是另一个主题),它也将列表框和选项卡控件相互分离。例如,您可以决定用其他类型的项目控件替换选项卡控件(如Telerik RadPanelBar),而不必更改任何代码。您可以这样做,因为视图模型是视图的逻辑模型,与任何视图的实现细节相隔离。

不要害怕查看模型。他们真的不复杂。实施财产变更通知有点令人讨厌,但在一天结束时,这是一个非常小的代价,需要支付一致,简单,灵活的软件。

+0

好吧,我相信:)我最终开始简单并尝试了几件事情。更新我的代码在顶部,所以我可以得到一点澄清!非常感谢您的意见和建议......我真的很感激它。 – 2011-01-27 20:42:07