5

私はUser Control'sメインに2つ座っていUserCotrolます。

そのうちの 1 つだけをメインにする必要があります。

の特定のプロパティViewModelを変更すると、次のように変更します。

<UserControl>
    <ContentControl>
        <ContentControl.Style>
            <Style TargetType="{x:Type ContentControl}">
                <Setter Property="Content">
                    <Setter.Value>
                        <local:UserControl1/>
                    </Setter.Value>
                </Setter>
                <Style.Triggers>
                    <DataTrigger Binding="{Binding IsTwo}" Value="True">
                        <Setter Property="Content">
                            <Setter.Value>
                                <local:UserControl2/>
                            </Setter.Value>
                        </Setter>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </ContentControl.Style>
    </ContentControl>
</UserControl>

プロパティを に変更するとFalse問題UserControl1なく動作しますが、 に変更するとTrue表示に問題があり、画面間を移動しているときにのみ収まります。一時的な解決策として、UserControl が必要になるたびにイベントを作成しました。 1 から 2 に変更します。そのイベントが実行されると、メインを削除しUserControlて再度作成します。

しかし、私の質問は、なぜ 1 つに変更すると再作成する必要がなく、2 つに変更すると必要になるのでしょうか?

これを解決する方法を教えてください(私は自分でやったことがあります)、なぜこれが起こっているのか説明したいのですが、これは私が興味を持っていることです.

4

1 に答える 1

5

あなたのWPFは大丈夫です。問題を再現できません。新しい WPF アプリケーションを開始し、これをそれにダンプします。次に、ユーザー コントロールに置き換えます (特定のものにバインドする場合は、ユーザー コントロールをテンプレートにバインドする必要がある場合があることに注意してください)。

ViewModel.cs:

public class ViewModel : INotifyPropertyChanged
{
    private bool _isTwo;

    public bool IsTwo
    {
        get { return _isTwo; }
        set
        {
            _isTwo = value;
            OnPropertyChanged("IsTwo");
        }
    }

    public ICommand Switch
    {
        get { return new RelayCommand((_) => { IsTwo = !IsTwo; }, (_) => true); }
    }

    public event PropertyChangedEventHandler PropertyChanged;

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

public class RelayCommand : ICommand
{
    private readonly Action<object> _action;
    private readonly Func<object, bool> _predicate;

    public RelayCommand(Action<object> action, Func<object, bool> predicate)
    {
        _action = action;
        _predicate = predicate;
    }

    public bool CanExecute(object parameter)
    {
        return _predicate(parameter);
    }

    public void Execute(object parameter)
    {
        _action(parameter);
    }

    public event EventHandler CanExecuteChanged;
}

メインウィンドウ

<Window.DataContext>
    <local:ViewModel/>
</Window.DataContext>

<DockPanel>
    <Button DockPanel.Dock="Top" Command="{Binding Switch}"> Switch </Button>
    <UserControl>
        <ContentControl >
            <ContentControl.Style>
                <Style TargetType="{x:Type ContentControl}">
                    <Setter Property="Content">
                        <Setter.Value>
                            <local:UserControl1 DataContext="{Binding UserControl1ViewModel}"/>
                        </Setter.Value>
                    </Setter>
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding IsTwo}" Value="True">
                            <Setter Property="Content">
                                <Setter.Value>
                                    <local:UserControl2/>
                                </Setter.Value>
                            </Setter>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </ContentControl.Style>
        </ContentControl>
        </UserControl>
</DockPanel>

2 つの新しい (空の) UserControls を作成し、2 つの異なる色を設定します。

オフ の上

これらの 1 つを問題のあるユーザー コントローラーに置き換えます。レイアウトに問題がある場合は、おそらくユーザー コントロールがサイズを変更しようとしているか、より適切なコンテナーに配置する必要があります。上記をDockPanelに貼り付けています。これは一般に、使用可能なスペースにコントロールを拡張するのに非常に適しています。

[編集]

したがって、いつ何が作成されたかを知りたい場合は、このいくつかのメッセージボックスをユーザーコントロールの ctor に叩き込みます

public UserControl1()
{
    InitializeComponent();

    MessageBox.Show("Created UserControl1");
}

public UserControl2()
{
    InitializeComponent();

    MessageBox.Show("Created UserControl2");
}

私にとっては、どちらもアプリケーションの起動時に作成されます。つまり、UserControl2 はまだ表示されていませんが、作成されています。Data Trigger が切り替わるまでバインドされていないと思われます。ただし、ユーザー コントロールでコード ビハインドを実行している場合、WPF が台無しになる可能性があります。

于 2013-03-21T10:37:36.253 に答える