1

私はMVVMの初心者です。メインUIを持つmainwindow.xamlファイルを含むメインプロジェクト「MVVMデモ」があります。アイテムのセットを含むリストボックスがあります。

<ListBox Name="ButtonPanel" ItemsSource="{Binding BoardTabs}" SelectedItem="{Binding SelectedTab, Mode=TwoWay}" >
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <StackPanel>
                            <TextBlock Text="{Binding Connect}"  >
                            </TextBlock>
                            <TextBlock Text="{Binding I2C}"  >
                            </TextBlock>
                            <TextBlock Text="{Binding Voltage}" >
                            </TextBlock>
                            <TextBlock Text="{Binding Clock}" >
                            </TextBlock>
                            <TextBlock Text="{Binding Codec}" >
                            </TextBlock>
                            <TextBlock Text="{Binding EEPROM}" >
                            </TextBlock>
                        </StackPanel>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>

新しいユーザーコントロールを開くには、リストボックスの各項目が必要です。メインプロジェクト(ソリューションファイルの2番目のプロジェクト)の外部に個別のユーザーコントロールを作成し、メインプロジェクト(ボードコントロールmvvm)への参照として追加したことに注意してください。

VoltageはuserControlの1つであり、私のUiが存在するVoltage.xamlファイルがあり、ビュー、モデル、およびビューモデルのクラスが異なります。Board Control MVVMプロジェクトにあるMainWindow.xamlの電圧項目(リストボックス内のテキストブロック)をクリックすると、新しいウィンドウとしてポップアップ表示されます。

これが、mainwindow.xamlUIからタブを選択する私のProductViewモデルクラスです。

private Product m_SelectedTab;
    public Product SelectedTab
    {
        get
        {
            return m_SelectedTab;
        }

        set
        {
            m_SelectedTab = value;
            NotifyPropertyChanged("SelectedTab");
        }
    }

Listbox(mainwindow.xaml)でアイテムを選択すると、ウィンドウのシャッドがポップアップし、上にあるVoltage.xamlUIが表示されます。明確な説明のためにさらにコードが必要な場合は、ここにアップロードしたいと思います。

助けてください :(

4

1 に答える 1

0

ただ明確にします; Connect、I2C、Voltage などが ListBox に必要な項目である場合、上記の Xaml は必要なものではありません。各アイテムにはこれらの TextBlocks がすべて含まれているため (ItemTemplate を複数の TextBlocks に定義しているため)。

代わりに、これらの各項目 (Connect、I2C など) が ListBox の項目であると想定しています。ここでも、やりたいことが別のページを開くことだけだと仮定すると、各 ListBoxItem 内で HyperlinkBut​​ton を使用できます。

<ListBox x:Name="ListBoxItems" ItemsSource="{Binding Path=Items}">
            <ListBox.ItemTemplate>
                <DataTemplate>                        
                    <HyperlinkButton NavigateUri="{Binding Path=Page}">
                        <HyperlinkButton.Style>
                            <Style TargetType="HyperlinkButton">
                                <Setter Property="HorizontalContentAlignment" Value="Left"/>
                                <Setter Property="HorizontalAlignment" Value="Stretch"/>
                                <Setter Property="Template">
                                    <Setter.Value>
                                        <ControlTemplate TargetType="HyperlinkButton">
                                            <ContentPresenter/>
                                        </ControlTemplate>
                                    </Setter.Value>
                                </Setter>
                            </Style>
                        </HyperlinkButton.Style>
                        <TextBlock Text="{Binding Path=Name}" />                            
                    </HyperlinkButton>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

ここで、Name と Page は、各アイテム (Connect、I2C など) を表す Item クラスのプロパティであり、Name は Name (Voltage) で、Page は、開きたい対応するページを指す Uri (/Voltage. xaml)

ListBox の ItemsSource は、ViewModel クラスの Items プロパティにバインドされ、Items は Item オブジェクトの ObservableCollection です。

ItemsViewModel viewModel = new ItemsViewModel() {
            Items = new ObservableCollection<Item>() { 
            new Item() { Name = "Item 1", Page = new Uri("/Page1.xaml", UriKind.Relative) },
            new Item() { Name = "Item 2", Page = new Uri("/Page2.xaml", UriKind.Relative) }}
        };

ページに追加のデータを渡したい場合は、クエリ文字列 (/Voltage.xaml?param=blah) を介してそれを行うか、各アイテムにコマンドを追加してナビゲーションを自分で処理することができます。

于 2013-01-15T12:44:11.113 に答える