0

これは私のビューモデルです:

class MainViewModel : ViewModelBase
{
    private CalculatorViewModel calc;
    public CalculatorViewModel Calculator {get {return calc; }set {calc = value; RaisePropertyChanged("Calculator");}}
}

class CalculatorViewModel : ViewModelBase
{
    private CalculatorMode mode;
    public CalculatorMode Mode {get {return mode;}set{mode=value; RaisePropertyChanged("CalculatorMode");}}

    public CalculatorViewModel()
    {
        Mode = new HexMode();
    }
}
abstract class CalculatorMode : ViewModelBase
{
    abstract int Calculate(...);
}
class HexMode : CalculatorMode
{
public int Calculate(...) { ...}
}

これは私の MainWindow です (MainViewModel インスタンスは Windows の DataContext に設定されています)。

<ad:DockingManager >
            <ad:DockingManager.LayoutItemTemplateSelector>
                <vm:PanesTemplateSelector>
                    <vm:PanesTemplateSelector.FileViewTemplate>
                        <DataTemplate>
                            <h:MyDocument  />
                        </DataTemplate>
                    </vm:PanesTemplateSelector.FileViewTemplate>
                    <vm:PanesTemplateSelector.CalculatorViewTemplate>
                        <DataTemplate>
                            <w:Calculator  />
                        </DataTemplate>
                    </vm:PanesTemplateSelector.CalculatorViewTemplate>
                </vm:PanesTemplateSelector>
            </ad:DockingManager.LayoutItemTemplateSelector>
</ad:DockingManager>

PanesTemplateSelector クラスのコード:

public DataTemplate FileViewTemplate
        {
            get;
            set;
        }

        public DataTemplate CalculatorViewTemplate
        {
            get;
            set;
        }

        public override System.Windows.DataTemplate SelectTemplate(object item, System.Windows.DependencyObject container)
        {
            if (item is DocumentViewModel)
                return FileViewTemplate;

            if (item is CalcualtorViewModel)
                return CalculatorViewTemplate;

            return base.SelectTemplate(item, container);
        }

Calculator-Control の内容:

<Grid Name="main">
    <Grid.RowDefinitions>
        <RowDefinition Height="auto" />
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>
    <ContentControl Name="content">
        <ContentControl.ContentTemplateSelector>
            <vm:CalculatorTemplateSelector>
                <vm:CalculatorTemplateSelector.DefaultView>
                    <DataTemplate>
                        <TextBlock Text="Dummy for normal view" Foreground="Wheat" />
                    </DataTemplate>
                </vm:CalculatorTemplateSelector.DefaultView>
                <vm:CalculatorTemplateSelector.HexView>
                    <DataTemplate>
                        <TextBlock Text="Dummy für Hexview" Foreground="Gray"/>
                    </DataTemplate>
                </vm:CalculatorTemplateSelector.HexView>
            </vm:CalculatorTemplateSelector>
        </ContentControl.ContentTemplateSelector>
    </ContentControl>
</Grid>

CalculatorTemplateSelector クラスのコード:

public DataTemplate HexView
        {
            get;
            set;
        }

        public DataTemplate DefaultView
        {
            get;
            set;
        }

        public override System.Windows.DataTemplate SelectTemplate(object item, System.Windows.DependencyObject container)
        {
            CalculatorViewModel cjmv = (CalculatorViewModel)item;

            if (cjmv != null)
            {
                if (cjmv.Mode is HexMode)
                    return HexView;

        return DefaultView;
            }

            return base.SelectTemplate(item, container);
        }

最初の TemplateSelector が機能しています。適切なテンプレートが選択され、Calculator-Control が表示されます。しかし、Calculator-Control の TemplateSelector は機能していません。CalculatorTemplateSelector.SelectTemplate では、item-parameter は常に null です。しかし、CalculatorViewModel-instance が必要です。私の問題は拘束力のある問題だと思いますが、解決には至りません。何か案は?

4

2 に答える 2

0

tl;dr ですが、確かなことは 1 つあります。

public CalculatorMode Mode [...] RaisePropertyChanged("CalculatorMode");}}

する必要があります:RaisePropertyChanged("Mode");}}

于 2012-08-24T07:26:34.470 に答える
0

私は尋ねるかもしれませんが、私の才能の一部をあなたに紹介するためだけです...

<ContentPresenter Name="content" DataContext="{Binding}">

SelectTemplate-Implementation を次のように変更します。

 public override System.Windows.DataTemplate SelectTemplate(object item, System.Windows.DependencyObject container)
        {
            ContentPresenter cp = container as ContentPresenter;
            if (cp != null)
            {
                CalculatorViewModel model = cp.DataContext as CalculatorViewModel;
                if (model != null)
                {
                    if (model.Mode is DefaultMode)
                        return DefaultView;
                    if (model.Mode is HexMode)
                        return HexView;
                }
            }
            return base.SelectTemplate(item, container);
        }

とにかく、間違った RaisePropertyChanged-Call の通知をありがとう

于 2012-08-24T08:10:01.090 に答える