2013-12-08 19 views
0

我創建了一個類似於Binding ContentControl Content for dynamic content的解決方案。但我堅持改變一些事情。模型視圖中的WPF更改控件

舉個例子,我創建了一個簡單的登錄命令。這完美地工作。我創建了一個我綁定到登錄命令的按鈕。

public RelayCommand LoginCommand { 
     get { 
      return new RelayCommand(Login); 
     } 
    } 


    public void Login(object o) { 
     if (Membership.ValidateUser(Username, Password)) { 
      ErrorVisible = Visibility.Hidden; 
     } else { 
      ErrorVisible = Visibility.Visible; 
     } 
    } 

我測試了這個,它的效果很好。但是當登錄成功時,我想將用戶控件更改爲其他內容。但我不知道該怎麼做。如何在我的視圖模型中更改ContentControl內容?所以實際上,用另一個控件替換當前的登錄控件。

+0

可以在網格中疊加兩個控件,並從視圖模型中切換每個控件的可見性。 –

回答

0

您可以像往常一樣綁定:

<ContentControl Content="{Binding Path=PropertyWithUI}"/> 

而在代碼:

public UIElement PropertyWithUI 
{ 
    get 
    { 
     return propertyWithUI; 
    } 
    set 
    { 
     propertyWithUI = value; 
     // notify property changed here 
    } 
} 

但它不是最好的方法,這是更好地把你的窗戶上都控制和他們的知名度屬性綁定到虛擬機中的屬性。

EDIT

下面是一個例子:

在XAML我有一個內容控制和一個按鈕:

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition/> 
     <RowDefinition Height="Auto"/> 
    </Grid.RowDefinitions> 

    <ContentControl Grid.Row="0" Content="{Binding Path=Control}"></ContentControl> 
    <Button Grid.Row="1" Height="40" Click="Button_Click">Change control</Button> 
</Grid> 

而在代碼:

一個微小的自定義MVVM:

public class MyMVVM : INotifyPropertyChanged 
    { 
     private UIElement control; 
     public UIElement Control 
     { 
      get { return control; } 
      set 
      { 
       if (control == value) 
        return; 
       control = value; 
       if (PropertyChanged != null) 
        PropertyChanged(this, new PropertyChangedEventArgs("Control")); 
      } 
     } 

     public event PropertyChangedEventHandler PropertyChanged; 
    } 

等窗口代碼。我創建了一個VM的實例,並用一個新的TextBox初始化Control屬性;

readonly MyMVVM mvvm = new MyMVVM(); 
    public MainWindow() 
    { 
     InitializeComponent(); 

     DataContext = mvvm; 
     mvvm.Control = new TextBox() {Text = "this is a text box"}; 
    } 

當用戶單擊我時,將控件更改爲其他。

private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     var wb = new WebBrowser(); 
     mvvm.Control = wb; 
     wb.Navigate("http://stackoverflow.com"); 
    } 

您可以在家中試用:)創建新的WPF項目並將代碼放在上面。

+0

但是這是加載另一個用戶控件?我的目標是取代另一個控制。所以當有人登錄時:替換內容。 – user2349987

+0

@ user2349987我更新我的評論,請再看一遍。 – Tony

相關問題