1

私の WPF アプリケーションでは、約 5 つのタブを持つタブ コントロールを使用しています。各タブのビューは、ツール ボックスを介して追加するユーザー コントロールです。

メイン Xaml ファイル:

<Grid>
    <TabControl Height="Auto" HorizontalAlignment="Stretch" Margin="0" Name="tabControl1" VerticalAlignment="Stretch" Width="Auto">
        <TabItem Header="Device Control" Name="Connect">
            <ScrollViewer Height="Auto" Name="scrollViewer1" Width="Auto">
                <my:ConnectView Name="connectView1" />
            </ScrollViewer>
        </TabItem>
        <TabItem Header="I2C">
            <ScrollViewer Height="Auto" Name="scrollViewer2" Width="Auto">
                <my1:I2CControlView Name="i2CControlView1" />
            </ScrollViewer>
        </TabItem>
            <TabItem Header="Voltage">
                <ScrollViewer Height="Auto" Name="scrollViewer3" Width="Auto">
                    <my2:VoltageView Name="voltageView1" />
                </ScrollViewer>
            </TabItem>
    </TabControl>
</Grid>

各ビュー ie.e に気づきConnect、ビュー、ビューモデル、I2CおよびVoltageモデルクラスを持つユーザーコントロールである場合:)

これらの各ビューには、それぞれの xaml ファイルに一連のテキスト ボックスがあります。

Connect.xaml:

<Grid>
    <Textbox Text="{Binding Box}", Name="hello" />
    // Some more textboxes
</Grid>

I2c.xaml:

<Grid>
    <Textbox Text="{Binding I2CBox}", Name="helI2c" />
    // Some more textboxes
</Grid>

電圧.xaml:

<Grid>
    <Textbox Text="{Binding VoltBox}", Name="heVoltllo" />
    // Some more textboxes
</Grid>**

デフォルトでは、これらのテキストボックスのテキストを何らかの値に設定しています。ビューモデルクラスでそれぞれ「12」「13」「14」としましょう。私の主な要件は、タブを変更したときに更新されるように、各ユーザー コントロールに存在するこれらのテキスト ボックスのテキストを設定することです。

説明:

接続ビューが表示されているとしましょう: テキストボックスの値が 12 で、それを編集して 16 に変更します。[I2C] タブをクリックしてから [接続] タブに戻り、テキストボックスの値を初期値に更新します。すなわち12。

正確には、これらのメソッドはすべてのユーザー コントロール クラスに記述できる visibilitychanged() というメソッドで、タブが変更されるたびにこれらの Ui コンポーネントの値を設定できますか?

助けてください :)

4

2 に答える 2

2

たとえば、わかりました。シンプルな WPF アプリがあります。メインウィンドウ:

<Window x:Class="tabs.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:my="clr-namespace:tabs" 
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <TabControl SelectionChanged="TabControl_SelectionChanged">
            <TabItem Header="1">
                <my:Tab1/>
            </TabItem>
            <TabItem Header="2">
                <my:Tab2/>
            </TabItem>
        </TabControl>
    </Grid>
</Window>

Tab1 は VS のデフォルト テンプレートにすぎないため、ここにコードはありません。タブ 2:

<UserControl x:Class="tabs.Tab2"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <Grid>
        <TextBox Height="23" HorizontalAlignment="Left" Name="textBox1" VerticalAlignment="Top" Width="120" Text="asd" />
    </Grid>
</UserControl>

ご覧のとおり、TabControl_SelectionChanged イベントのイベント ハンドラーがあります。メインウィンドウの背後にあるコードには、次のものがあります。

private void TabControl_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    if (e.Source is TabControl)
    {
        TabItem tabitem = e.AddedItems[0] as TabItem;
        if (tabitem == null)
            return;

        Tab2 tab2 = tabitem.Content as Tab2;
        if (tab2 == null)
            return;

        tab2.textBox1.Text = "zxczxczxczxc";
    }
}

このようなもの。テキストボックスの値を設定する代わりに、Reinit メソッドを呼び出すことができます。これが役立つことを願っています。

于 2012-10-22T14:03:12.453 に答える
1

TabControl の「SelectedTab」または「SelectedIndex」プロパティにデータ バインディングを実行できます。したがって、ユーザーがタブを変更するたびに、ビューモデルのセッターが呼び出され、そこでテキストボックスのプロパティバインディングをリセットできます..

編集:

ここにサンプルがあります

XAML:

<TabControl SelectedIndex="{Binding TabIndex}">
            <TabItem Header="Tab 1">
                <TextBox Text="{Binding TextValue1}" Height="20" Width="200"></TextBox>
            </TabItem>
            <TabItem Header="Tab 2">
                <TextBox Text="{Binding TextValue2}" Height="20" Width="200"></TextBox>
            </TabItem>
            <TabItem Header="Tab 3">
                <TextBox Text="{Binding TextValue3}" Height="20" Width="200"></TextBox>
            </TabItem>
        </TabControl>

ViewModel のプロパティとメソッド:

private int tabIndex;
        public int TabIndex
        {
            get { return tabIndex; }
            set
            {
                tabIndex = value;
                NotifyPropertyChanged("TabIndex");

                ResetTextBoxes();
            }
        }

        private void ResetTextBoxes()
        {
            TextValue1 = "12";
            TextValue2 = string.Empty;
            TextValue3 = "default";
        }

        private string textValue1;
        public string TextValue1
        {
            get { return textValue1; }
            set
            {
                textValue1 = value;
                NotifyPropertyChanged("TextValue1");
            }
        }

        private string textValue2;
        public string TextValue2
        {
            get { return textValue2; }
            set
            {
                textValue2 = value;
                NotifyPropertyChanged("TextValue2");
            }
        }

        private string textValue3;
        public string TextValue3
        {
            get { return textValue3; }
            set
            {
                textValue3 = value;
                NotifyPropertyChanged("TextValue3");
            }
        }
于 2012-10-22T16:28:01.167 に答える