0

これは私が数日間解決しようとしてきた問題ですが、まだ良い解決策を見つけていません.

StackPanel を含むメインの WPF ウィンドウがあります。「MessagePreview」と呼ばれるカスタム WPF コントロールのリストを含む「MessageManagement」というクラスもあります。

メッセージプレビュー

<UserControl x:Class="FinalYearProject.MessagePreview"
         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="58" d:DesignWidth="254" Background="White" BorderThickness="1" BorderBrush="#FF320000">
<Grid Name="grid1">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="50" MaxWidth="50" MinWidth="50" />
        <ColumnDefinition Width="197*" MinWidth="20" />
    </Grid.ColumnDefinitions>
    <Grid Grid.Column="1" Name="grid2">
        <Grid.RowDefinitions>
            <RowDefinition Height="31*" />
            <RowDefinition Height="34*" />
            <RowDefinition Height="33*" />
        </Grid.RowDefinitions>
        <Label Content="-ERROR-" Height="28" HorizontalAlignment="Left" Margin="2,1,0,0" Name="senderLabel" VerticalAlignment="Top" Foreground="#FF0000B4" Grid.RowSpan="2" />
        <Label Content="-ERROR-" Height="33" HorizontalAlignment="Left" Name="previewLabel" VerticalAlignment="Top" Margin="-1,17,0,0" Grid.RowSpan="3" />
        <Label Content="-Error-" Grid.Row="1" Height="28" HorizontalAlignment="Left" Margin="0,16,6,0" Name="timeLabel" VerticalAlignment="Top" Grid.RowSpan="2" Width="196" />
    </Grid>
    <Grid Name="grid3">
        <Grid.RowDefinitions>
            <RowDefinition Height="29*" />
            <RowDefinition Height="27*" />
        </Grid.RowDefinitions>
        <Image Height="38" HorizontalAlignment="Center" Margin="3,0,6,20" Name="image1" Stretch="Fill" VerticalAlignment="Bottom" Width="41" Source="/FinalYearProject;component/Images/twitter-bird-light-bgs.png" Grid.RowSpan="2" />
        <CheckBox Height="16" Margin="15,0,22,6" Name="checkBox" VerticalAlignment="Bottom" Grid.Row="1" IsChecked="False" />
    </Grid>
</Grid>

メッセージ管理

List<MessagePreview> unread = new List<MessagePreview>();

    public bool messagesLocked()
    {
        foreach (MessagePreview m in unread)
        {
            if ((bool)m.checkBox.IsChecked)
                return true;
        }
        return false;
    }

メインウィンドウ C#

MessageManagement messageManagement;

MessagesPanel1 は MainWindow 内の空の StackPanel です

if (!messageManagement.messagesLocked())
{
       foreach (Message m in messageManagement.getListOfMessages()
       {
              MessagesPanel1.Children.Add(m)
       }
}

カスタム コントロールを StackPanel に追加すると、オリジナルの複製が作成されます。つまり、StackPanel 内のコントロールの値を変更しても、MessageManagement リスト内のコントロールには影響しません。

元のコントロールを参照して、一緒に変更する方法はありますか? DataBinding を調べましたが、それが適切な領域かどうかわかりません。

4

2 に答える 2

1

List繰り返しますが、WPF では UI 要素を作成しません。を使用し、ItemsControlそのItemTemplateプロパティをアイテムを表すために必要な UI に設定します。

 <ItemsControl ItemsSource="{Binding Messages}">
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <!-- Everything you placed in your usercontrol, or else an instance of your usercontrol itself -->
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
于 2013-01-16T17:45:47.317 に答える
0

「変更」と言う場合、データは変更WPFされる可能性があるため、要素に直接アクセスする必要はありません。UIあなたがしなければならないことは、それらにバインドされたデータを読み取ることです。databindingそのコントロールを正しく設定する、常に情報が更新されます。

要素へのアクセスUIは決して簡単ではありませんが、データにアクセスする方法は完全に信頼できません。制御が に注入される方法が変更されるVisualTree 可能性があるため、次の更新でコードが失敗する可能性があります。

たとえば、ここで見ることができる設計方法について:

WPF データ バインディングの例

于 2013-01-16T16:16:09.213 に答える