2017-09-09 23 views
8

मैं कैलिबर्न का उपयोग कर एक आवेदन कर रहा हूं। माइक्रो (आसान डेटा बाइंडिंग और सामान के लिए) और महापैप्स। मेट्रो (डिज़ाइनिंग के लिए)।सी # wpf caliburn.Micro MahApps हैम्बर्गरमेनू। सामग्री टेंप्लेट डेटा बाध्यकारी काम नहीं कर रहा है

मैंने एक दृश्य नाम 'मेन व्यू' बनाया है जिसमें महापैप्स के HamburgerMenu हैं। मेरा मुद्दा डेटा बाइंडिंग HamburgerMenu.ContentTemplate टैग

के तहत ठीक काम कर रहा है, यह मेरा HamburgerMenu.ContentTemplate xaml है।

<Page x:Class="Sample.Views.MainView" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:cal="http://www.caliburnproject.org" 
     xmlns:mah="clr-namespace:MahApps.Metro.Controls;assembly=MahApps.Metro" 
     xmlns:iconPacks="http://metro.mahapps.com/winfx/xaml/iconpacks" 
     xmlns:utils="clr-namespace:Omni.WindowsClient.Utils" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:local="clr-namespace:Omni.WindowsClient.Views" 
     mc:Ignorable="d" 
     d:DesignHeight="300" 
     d:DesignWidth="600"> 

    <Page.Resources> 
     <DataTemplate x:Key="HamburgerMenuItem" 
         DataType="{x:Type mah:HamburgerMenuItem}"> 
      <Grid Height="48"> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="48" /> 
        <ColumnDefinition /> 
       </Grid.ColumnDefinitions> 
       <Image Margin="12" 
         HorizontalAlignment="Center" 
         VerticalAlignment="Center" 
         Source="{Binding Glyph}" 
         Stretch="UniformToFill" /> 
       <TextBlock Grid.Column="1" 
          VerticalAlignment="Center" 
          FontSize="16" 
          Foreground="White" 
          Text="{Binding Label}" /> 
      </Grid> 
     </DataTemplate> 
    </Page.Resources> 

    <Grid> 

     <mah:HamburgerMenu x:Name="HamburgerMenuControl" 
          SelectedIndex="0" 
          ItemTemplate="{StaticResource HamburgerMenuItem}" 
          OptionsItemTemplate="{StaticResource HamburgerMenuItem}" 
          IsPaneOpen="True" 
          DisplayMode="CompactInline" 
          cal:Message.Attach="[Event ItemClick] = [Action ShowDetails(HamburgerMenuControl.SelectedItem)]" 
          DataContext="{Binding RelativeSource={RelativeSource self}}"> 
      <mah:HamburgerMenu.ItemsSource> 
       <mah:HamburgerMenuItemCollection> 
        <mah:HamburgerMenuItem Label="System Status"> 
         <mah:HamburgerMenuItem.Tag> 
          <iconPacks:PackIconFontAwesome Width="22" 
                  Height="22" 
                  HorizontalAlignment="Center" 
                  VerticalAlignment="Center" 
                  Kind="Tasks" /> 
         </mah:HamburgerMenuItem.Tag> 
        </mah:HamburgerMenuItem> 
        <mah:HamburgerMenuItem Label="Inbox"> 
         <mah:HamburgerMenuItem.Tag> 
          <iconPacks:PackIconFontAwesome Width="22" 
                  Height="22" 
                  HorizontalAlignment="Center" 
                  VerticalAlignment="Center" 
                  Kind="Inbox" /> 
         </mah:HamburgerMenuItem.Tag> 
        </mah:HamburgerMenuItem> 
         <mah:HamburgerMenuItem.Tag> 
          <iconPacks:PackIconFontAwesome Width="22" 
                  Height="22" 
                  HorizontalAlignment="Center" 
                  VerticalAlignment="Center" 
                  Kind="Certificate" /> 
         </mah:HamburgerMenuItem.Tag> 
        </mah:HamburgerMenuItem> 
       </mah:HamburgerMenuItemCollection> 
      </mah:HamburgerMenu.ItemsSource> 

      <mah:HamburgerMenu.ContentTemplate> 
       <DataTemplate DataType="{x:Type mah:HamburgerMenuItem}"> 
        <Grid utils:GridUtils.RowDefinitions="48,*"> 
         <!--cal:Action.TargetWithoutContext="{Binding ElementName=HamburgerMenuControl, Path=DataContext}"--> 
         <Border Grid.Row="0" 
           Background="{DynamicResource MahApps.Metro.HamburgerMenu.PaneBackgroundBrush}"> 
          <TextBlock x:Name="Header" 
             HorizontalAlignment="Center" 
             VerticalAlignment="Center" 
             FontSize="24" 
             Foreground="White" /> 
          <!--Text="{Binding Path=Header, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"--> 
         </Border> 
         <Frame Grid.Row="1" 
           cal:Message.Attach="RegisterFrame($source)" 
           DataContext="{x:Null}" 
           NavigationUIVisibility="Hidden" /> 
        </Grid> 
       </DataTemplate> 
      </mah:HamburgerMenu.ContentTemplate> 

     </mah:HamburgerMenu> 

    </Grid> 
</Page> 

और संबंधित दृश्य मॉडल कोड है:

using Caliburn.Micro; 
using MahApps.Metro.Controls; 
using System.Windows.Controls; 

namespace Sample.ViewModels 
{ 
    public class MainViewModel : Screen 
    { 
     private readonly SimpleContainer _container; 
     private INavigationService _navigationService; 
     private string _header; 

     public string HeaderTitle 
     { 
      get { return _header; } 
      set 
      { 
       _header = value; 
       NotifyOfPropertyChange(); 
      } 
     } 

     public MainViewModel(SimpleContainer container) 
     { 
      this._container = container; 
      DisplayName = "Main"; 
     } 

     public void RegisterFrame(Frame frame) 
     { 
      _navigationService = new FrameAdapter(frame); 
      _container.Instance(_navigationService); 
      _navigationService.NavigateToViewModel(typeof(SystemStatusViewModel)); 
      HeaderTitle = "System Status"; 
     } 

     public void ShowDetails(HamburgerMenuItem menuItem) 
     { 
      switch (menuItem.Label) 
      { 
       case "System Status": 
        _navigationService.NavigateToViewModel(typeof(SystemStatusViewModel)); 
        HeaderTitle = "System Status"; 
        break; 
       case "Inbox": 
        _navigationService.NavigateToViewModel(typeof(InboxViewModel)); 
        HeaderTitle = "Inbox"; 
        break; 
       default: 
        break; 
      } 
     } 

    } 
} 

मैं HamburgerMenu.ContentTemplate तहत फ्रेम में देखें बदलने के लिए जब मैं मेनू आइटम पर क्लिक करें। सिस्टम स्थिति दृश्य की तरह SystemStatusView और इनबॉक्स दृश्य इनबॉक्स व्यू है।

मेरा कोड ठीक काम कर रहा है (यह फ्रेम में दृश्य को बदलता है और हेडर लेबल भी बदलता है) यदि मैं HamburgerMenu.ContentTemplate का उपयोग नहीं करता हूं। लेकिन मैं HamburgerMenu के साथ काम करने के लिए HamburgerMenu.ContentTemplate का उपयोग करना चाहता हूं।

धन्यवाद!

+1

आपको ** ** काम नहीं कर रहा है के बारे में अधिक विशिष्ट होना चाहिए। जब आप 'ContentTemplate' का उपयोग करते हैं तो आप क्या व्यवहार देख रहे हैं? मैंने आपके कोड को जितना संभव हो उतना अच्छा बना दिया है, और जब मैं मेनू आइटम पर क्लिक करता हूं, तो फ्रेम अपेक्षित दृश्य मॉडल पर नेविगेट करता है। –

उत्तर

2

यदि आप HamburgerMenu.ContentTemplate का उपयोग नहीं करते हैं तो यह ठीक काम कर रहा है, लेकिन जब आप करते हैं तो काम करना बंद कर देता है, तो समस्या शायद डिफ़ॉल्ट टेम्पलेट को उस तरीके से ओवरराइट कर रही है जो नियंत्रण की सभी कार्यक्षमताओं का समर्थन नहीं करती है।

मैं आपको डिफ़ॉल्ट HamburgerMenu.ContentTemplate प्राप्त करने के लिए ब्लेंड का उपयोग करने का सुझाव दूंगा, फिर इसे बहुत अधिक बदलने के बिना इसे अपनी आवश्यकताओं में संपादित करें (ध्यान रखें कि टेम्पलेट के रूप में उपयोग किए गए नियंत्रणों के नाम का एक महत्वपूर्ण अर्थ हो सकता है, इसलिए हो सकता है सावधान रहें कि आप क्या संपादन कर रहे हैं)।

यदि आपको पता नहीं है कि अपने नियंत्रण के टेम्पलेट को प्राप्त करने के लिए ब्लेंड का उपयोग कैसे करें, तो documentation of Telerik controls में वर्णित एक साधारण ट्यूटोरियल है (चिंता न करें, यह सभी नियंत्रणों के लिए समान कार्य करता है)। आपको बस HamburgerMenu.ContentTemplate की प्रतिलिपि बनाने की आवश्यकता है, इसे अपने एप्लिकेशन पर पेस्ट करें और आप (संपादन) जाने के लिए अच्छे हैं।

संबंधित मुद्दे