2011-07-26 33 views
2

在我的WPF應用MVVM我需要創建2個選項的帳號或高級搜索(按姓名,電子郵件等)WPF - MVVM - 有條件包括用戶控制,查看

簡單搜索帳戶搜索視圖在我的AccountSearchViewModel中,我有一個bool屬性IsAdvancedMode。

而且我已經建立2個用戶控件每種模式:SimpleSearchView和AdvancedSearchView

現在我需要證明一方基於IsAdvancedMode財產。

這樣做的最佳方法是什麼?

此外作爲一般解決方案如果我有SearchMode屬性是枚舉。在這種情況下如何在多個控件之間切換?

回答

1

我通常把它們都然後使用BooleanToVisibilityConverter。最簡單的方法與你已經設置。

<Grid> 
    <SimpleSearch /> 
    <AdvancedSearch 
      Visibility="{Binding IsAdvancedMode, Converter={StaticResource btvc}"/> 
</Grid> 

IsAdvancedModetrue,則填寫AdvancedSearch控制將覆蓋SimpleSearch。再次,這是最簡單的方法,不一定是最好的。

+0

我必須同意這不是最好的方式 - 更像是一個黑客,但它爲我工作我急需解決我的問題。 –

+1

@MichaelD .:我不會那麼苛刻,稱它爲黑客。將UI元素疊加在另一個元素上是一種古老的做法。當然,不應該爲了安全目的而做這件事。如果它涉及到你,創建一個'InverseBooleanToVisibilityConverter'非常簡單。 – Will

5

我認爲你需要使用Data Templating,要做到這一點,你需要創建三類:

 public class Search 
     { 
      //Your Code 
     } 

     public class AdvanceSearch : Search 
     { 
      //Your Code 
     } 

     public class SimpleSearch : Search 
     { 
      //Your Code 
     } 

,然後創建類數據模板的基礎:

<DataTemplate DataType="{x:Type local:AdvanceSearch }"> 
    <StackPanel> 
    <TextBlock Text="{Binding Path=Name}" /> 
    <TextBlock Text="{Binding Path=Email}"/>  
    </StackPanel> 
</DataTemplate> 

<DataTemplate DataType="{x:Type local:SimpleSearch }"> 
    <StackPanel> 
    <TextBlock Text="{Binding Path=Name}" />  
    </StackPanel> 
</DataTemplate> 
+0

不好...我想綁定到ViewModel中的屬性,以便用戶可以在視圖之間切換。此外,我的預先搜索更加複雜 - 它實際上是查詢生成器,爲什麼我需要它來控制它自己的 –

+0

搜索所有者類將具有Search屬性,該屬性將基於不同搜索類型之間的用戶切換進行實例化。你可以在預先搜索類中實現你所有的查詢生成器代碼。 – Behnam

+0

@MichaelD .:這是*一個真正的答案*。你應該考慮這樣做。 – Will

3

我會用一個DataTrigger根據需要更換ContentControlContentTemplate。我寫了一篇文章關於MVVM here切換視圖如果你有興趣(事例包括)

下面是一些快速的測試代碼演示它:

<Window.Resources> 
    <DataTemplate x:Key="TemplateA" > 
     <TextBlock Text="I'm Template A" /> 
    </DataTemplate> 

    <DataTemplate x:Key="TemplateB" > 
     <TextBlock Text="I'm Template B" /> 
    </DataTemplate> 
</Window.Resources> 

<StackPanel> 
    <ToggleButton x:Name="Test" Content="Test" /> 

    <ContentControl> 
     <ContentControl.Style> 
      <Style TargetType="{x:Type ContentControl}"> 
       <Setter Property="ContentTemplate" Value="{StaticResource TemplateA}" /> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding ElementName=Test, Path=IsChecked}" Value="True"> 
         <Setter Property="ContentTemplate" Value="{StaticResource TemplateB}" /> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </ContentControl.Style> 
    </ContentControl> 
</StackPanel> 
+0

嗯 - 我完全按照你的建議做了,但是我的視圖顯示如下:System.Windows.DataTemplate,而不是渲染模板的內容。會有什麼問題? –

+0

@Michael你是否在改變'ContentTemplate'屬性而不是'Template'屬性?這聽起來像是遇到了一個DataTemplate對象作爲Content,因此使用默認的'ToString()'方法來呈現它。 – Rachel

+0

我剛剛從您的博客複製了整個代碼。它改變了「ContentTemplate」。我用我的代碼發佈了一條評論到您的博客文章。 –