0

コレクション項目の MenuItems を作成しようとしましたが、失敗しました。詳細: 文字列プロパティ 'HeadText' を定義する単純なクラス ClassA があります。私の MainViewModel では、ObservableCollection プロパティを定義しました。コレクションは3点で充実。XAML で、ClassA タイプのこれら 3 つの項目の MenuItems を作成したいと考えています。私は次のことをしました:

<Window.Resources>
    <CompositeCollection x:Key="CollA">
        <ItemsControl ItemsSource="{Binding Path=MItems}">
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <MenuItem Header="{Binding HeadText}"/>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    </CompositeCollection>
</Window.Resources>

<Grid>
    <Menu DockPanel.Dock="Top" ItemsSource="{Binding Source={StaticResource CollA}}"/>
</Grid>

しかし、私が得るのは空のメニューバーだけです。どうすればこれを行うことができますか?

ビューモデルとクラス ClassA:

public class MainVM
{
    public MainVM() {
        _mItems.Add(new ClassA() { HeadText = "A" });
        _mItems.Add(new ClassA() { HeadText = "B" });
        _mItems.Add(new ClassA() { HeadText = "C" });
    }

    private ObservableCollection<ClassA> _mItems = new ObservableCollection<ClassA>();
    public ObservableCollection<ClassA> MItems{
        get { return _mItems; }
    }
}

public class ClassA
{
    public ClassA() { }
    public String HeadText { get; set; }
}

前もって感謝します。

編集:

私がこれを書くと、それは動作します:

<Menu DockPanel.Dock="Top" ItemsSource="{Binding MItems}">
    <Menu.ItemContainerStyle>
        <Style TargetType="MenuItem" BasedOn="{StaticResource {x:Type MenuItem}}">
            <Setter Property="Header" Value="{Binding HeadText}"/>
        </Style>
    </Menu.ItemContainerStyle>
</Menu>

しかし、私はそれを別の方法でやりたいと思っています。そして、なぜ他の方法がうまくいかないのか興味があります。

4

1 に答える 1

0

ここで答えを見つけました。私の XAML は最初に次のようになりました。

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

    <Window.Resources>
        <CollectionViewSource Source="{Binding Path=MItems}" x:Key="source"/>
    </Window.Resources>

    <StackPanel>
        <Menu DockPanel.Dock="Top">
            <Menu.ItemContainerStyle>
                <Style TargetType="MenuItem">
                    <Setter Property="Header" Value="{Binding HeadText}"/>
                </Style>
            </Menu.ItemContainerStyle>
        <Menu.ItemsSource>
            <CompositeCollection>
                <MenuItem Header="Static 1"/>
                <MenuItem Header="Static 2"/>
                <CollectionContainer Collection="{Binding Source={StaticResource source}}"/>
                <MenuItem Header="Static 3"/>
            </CompositeCollection>
        </Menu.ItemsSource>
    </Menu>
</StackPanel>

MainVM.cs と ClassA:

public class MainVM
{
    public MainVM() {
        _mItems.Add(new ClassA() { HeadText = "Dyn1" });
        _mItems.Add(new ClassA() { HeadText = "Dyn2" });
        _mItems.Add(new ClassA() { HeadText = "Dyn3" });
    }

    private ObservableCollection<ClassA> _mItems = new ObservableCollection<ClassA>();
    public ObservableCollection<ClassA> MItems{
        get { return _mItems; }
    }
}

public class ClassA
{
    public ClassA() { }

    private string _text = "";
    public String HeadText {
        get { return _text; }
        set { _text = value; }
    }
}

これは正常に機能しますが、静的メニュー項目と動的メニュー項目を実際に混在させると、Visual Studio が BindingExpression エラーを返すことに注意する必要があります。

これは、XAML パーサーが指定された ItemContainerStyle を動的 AND 静的メニュー項目に適用するためです。新しい MenuItem を作成し、新しく作成された MenuItem の Header プロパティに HeadText プロパティをバインドします。これは、動的メニュー項目と静的メニュー項目に対して行われます。MenuItem クラスには HeadText プロパティがないため、エラーが表示されます。

アプリケーションがクラッシュすることはありませんが、良い解決策ではありません。これを回避するには、次のように MenuBar を分割します。

    <StackPanel>
        <Grid DockPanel.Dock="Top">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="Auto"/>
                <ColumnDefinition Width="Auto"/>
                <ColumnDefinition Width="*"/>
            </Grid.ColumnDefinitions>
            <Menu Grid.Column="0">
                <MenuItem Header="Static 1"/>
                <MenuItem Header="Static 2"/>
            </Menu>
            <Menu Grid.Column="1">
                <Menu.ItemContainerStyle>
                    <Style TargetType="MenuItem">
                        <Setter Property="Header" Value="{Binding HeadText}"/>
                    </Style>
                </Menu.ItemContainerStyle>
                <Menu.ItemsSource>
                    <CompositeCollection>
                        <CollectionContainer Collection="{Binding Source={StaticResource source}}"/>
                    </CompositeCollection>
                </Menu.ItemsSource>
            </Menu>
            <Menu Grid.Column="2">
                <MenuItem Header="Static 3"/>
            </Menu>
        </Grid>
    </StackPanel>

たぶん、より良い解決策があります。その場合はお知らせください。

于 2015-02-15T22:04:46.407 に答える