2015-09-04 49 views
2

我正在做WPF UserControlWPF UserControls:有一個只能在UserControl內部使用的命令

在這個UserControl的內部,我有幾個Button可以在某些條件下使用,所以綁定到一個命令是完美的。

這些按鈕所調用的命令不應該在UserControl外部可用。

如果我讓我的命令爲private,則UserControl的XAML表示他想要公共成員。

那麼,如何讓一個UserControl在內部有幾個命令,但在UserControl之外不可用?

例子:

<Wizard CanGoPrevious="{Binding SomeViewModelProperty}"> 
    <WizardPage> 
     <TextBlock>Page one</TextBlock> 
    </WizardPage> 
</Wizard> 

嚮導的XAML:

<DockPanel DataContext="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type wizard:Wizard}}}" LastChildFill="True"> 
    <StackPanel Orientation="Horizontal" DockPanel.Dock="Bottom" HorizontalAlignment="Right"> 
     <Button Content="{Binding PreviousButtonText}" Command="{Binding GoToPreviousPageCommand}"/> 
    </StackPanel> 
    <ContentControl ></ContentControl> 
</DockPanel> 

嚮導的代碼背後:

//Protected doesn't work. Also, this command should not be available outside of the Wizard `UserControl` 
protected DelegateCommand GoToPreviousPageCommand { get; set; } 

這是在構造函數中這樣分配

GoToPreviousPageCommand = new DelegateCommand(GoToPreviousPage, CanGoToPreviousPage); 


    private void GoToPreviousPage() 
    { 
     //[...] 
    } 

    private bool CanGoToNextPage() 
    { 
     //Some usage of the Wizard's DP: 
     return CanGoPrevious //&& some other stuff 
    } 
+0

不要打擾。這是一個用戶控件 - 在代碼隱藏中包含關於UI的邏輯是完全正確的。 – Will

+0

@Will好吧,但是沒有找到提供UserControl公共訪問命令的命令,這些命令只能在內部使用。 – J4N

回答

1

編輯:添加示例代碼(應該能夠複製/過去/運行): 將命令保留爲公共,但讓您的ViewModel內部將使外部代碼不可見!窗口後面

<Window x:Class="InternalCommandUsageSample.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:InternalCommandUsageSample" 
    Title="MainWindow" Height="350" Width="525"> 
<local:MyUserControl/> 

代碼,用於測試用戶控制:

using System.Windows; 

namespace InternalCommandUsageSample 
{ 
public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     var vm = new MyViewModel(); 
     DataContext = vm; 

     InitializeComponent(); 
    } 
} 

}

用戶控制:

<UserControl x:Class="InternalCommandUsageSample.MyUserControl" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
<StackPanel> 
    <TextBlock Text="{Binding Message, Mode=OneWay}"/> 
    <Button Content="Test Me" Command="{Binding TestMeCommand}"/> 
</StackPanel> 

,這是不是您的程序集外部不可見的內部視圖模型:

internal class MyViewModel : INotifyPropertyChanged 
{ 
    private string _message = "click the button"; 
    private DelegateCommand _cmd; 

    public DelegateCommand TestMeCommand 
    { 
     get 
     { 
      return _cmd ?? (_cmd = new DelegateCommand(cmd => { Message = "Your button click envoked an internal command"; })); 
     } 
    } 

    public string Message 
    { 
     get { return _message; } 
     set 
     { 
      if (_message != value) 
      { 
       _message = value; 
       OnPropertyChanged("Message"); 
      } 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    protected virtual void OnPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

編輯:addtional有人詢問關於如何使用控制發售者和視圖模型的依賴屬性評論。有很多方法,這是其中之一:

 public string MySampleDependencyProperty 
    { 
     get { return (string)GetValue(MySampleDependencyPropertyProperty); } 
     set { SetValue(MySampleDependencyPropertyProperty, value); } 
    } 

    public static readonly DependencyProperty MySampleDependencyPropertyProperty = 
     DependencyProperty.Register("MySampleDependencyProperty", typeof(string), 
     typeof(MyUserControl), 
     new FrameworkPropertyMetadata("", 
      FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, (o, e) => ((MyUserControl)o).OnMySampleDependencyPropertyChanged())); 

    private void OnMySampleDependencyPropertyChanged() 
    { 
     viewMdoel.WhateverProperty = MySampleDependencyProperty; 
    } 
+0

好吧,這意味着這是可以從庫內編輯,但它是可以接受的。最初我想創建一個ViewModel,但是我沒有感覺到可以使用'DependencyProperties',我錯了嗎? – J4N

+0

發佈一段代碼,以便我可以看到你在說什麼。因爲使用ViewModel您不需要依賴屬性,只要它們引發propertyChanged事件,就可以擁有常規屬性。另外一個Command可以(或者通常)有一個私人setter,所以它不可編輯。 –

+0

你想看什麼代碼的一部分?問題是,在我們將使用這個'UserControl'的窗口內,(UserControl的)一些屬性將被綁定到MainWindow的ViewModel的屬性。並且在我的UserControl中,我需要這些綁定值的一些值 – J4N

相關問題