3

実行時に異なるUserControlビューをバインドする必要がある2つのContentControlを含むUserControlがあります。ここに記載されている添付プロパティソリューションは、Silverlightでは機能しないようです。または、私は何か間違ったことをしています。私もこれを見つけましが、それも喜びをもたらしませんでした。

'ActiveItem'という名前の単一のContentControlが機能していました。ただし、もちろん、同じ名前のContentControlを2つ持つことはできません。

助けてくれてありがとう、

ジム

4

2 に答える 2

5

メインビューモデルで2つのパブリックプロパティを公開するだけです。各プロパティは、表示するビューモデルのタイプのインスタンスです。次に、ビューContentControlに対応する名前のがあります。例えば:

public class MyMainViewModel
{
  private NavigationViewModel navigation;
  private MyContentViewModel main;

  public MyMainViewModel()
  {
    // better to inject factories using constructor injection here
    this.Navigation = new NavigationViewModel();
    this.Main = new MyContentViewModel();
  }

  public NavigationViewModel Navigation
  {
    get { return navigation; }
    set { navigation= value; NotifyOfPropertyChanged(() => this.Navigation); }
  }

  public MyContentViewModel Main
  {
    get { return main; }
    set { main= value; NotifyOfPropertyChanged(() => this.Main); }
  }

  ...
}

<ContentControl x:Name="Navigation" />
...
<ContentControl x:Name="Main" />
于 2011-08-01T12:34:20.553 に答える
0

これは古い質問ですが、誰かが同じ問題を抱えている場合に備えて、最初からより徹底的に処理する方法をここに投稿します。

  1. 両方(または3つ以上)のユーザーコントロールを含むメインウィンドウは、Caliburn.Micro.Conductor<Screen>.Collection.AllActive;から継承する必要があります。
  2. ユーザーコントロールはCaliburn.Micro.Screen;から継承する必要があります。
  3. また、命名規則にも留意する必要があります。ビューでContentControlの名前としてMenuUCを使用する場合は、ViewModelでMenuUCという名前のプロパティも作成します。
  4. コンストラクターで行うように、UserControlを初期化します。
  5. ActivateItem(MenuUC)これで、コード内のDeactivateItem(MenuUC)どこでも使用できます。Caliburn.Microは、操作するものを自動的に検出します。

XAMLビューコードの例:

<Window x:Class="YourProject.Views.YourView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d"
        Title="YourViewTitle" Width="900" Height="480">

    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="4*"/>
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>

        <!-- Menu Side Bar -->
        <ContentControl Grid.Row="0" Grid.Column="0" x:Name="MenuUC" />

        <!-- Panel -->
        <Border Grid.Column="1" Grid.RowSpan="2" BorderThickness="1,0,0,0" BorderBrush="#FF707070" >
            <ContentControl x:Name="PanelUC" />
        </Border>
    </Grid>
</Window>

C#ViewModelコードの例:

class YourViewModel : Conductor<Screen>.Collection.AllActive
{
    // Menu Side Bar
    private MenuUCViewModel _menuUC;
    public MenuUCViewModel MenuUC
    {
        get { return _menuUC; }
        set { _menuUC = value; NotifyOfPropertyChange(() => MenuUC); }
    }

    // Panel
    private Screen _panelUC;
    public Screen PanelUC
    {
        get { return _panelUC; }
        set { _panelUC = value; NotifyOfPropertyChange(() => PanelUC); }
    }

    // Constructor
    public YourViewModel()
    {
        MenuUC = new MenuUCViewModel();
        ActivateItem(MenuUC);

        PanelUC = new FirstPanelUCViewModel();
        ActivateItem(PanelUC);
    }

    // Some method that changes PanelUC (previously FirstPanelUCViewModel) to SecondPanelUCViewModel
    public void ChangePanels()
    {
        DeactivateItem(PanelUC);
        PanelUC = new SecondPanelUCViewModel();
        ActivateItem(PanelUC);
    }
}

上記の例では、ChangePanels()は、新しいユーザーコントロールをContentControlにロードするメソッドとして機能します。

また、この質問を読んでください、それはさらにあなたを助けるかもしれません。

于 2020-05-30T16:39:46.137 に答える