كيف يمكنني استبدال صورة في شبكة WPF مع عنصر تحكم آخر تبعا لمصدر البيانات؟

StackOverflow https://stackoverflow.com/questions/424562

  •  05-07-2019
  •  | 
  •  

سؤال

ولدي شبكة المنصوص عليها مثل ذلك؛

+---------+---------+
|  Image  | Details |
|    is   |  pane   |
|  here   | for data|
|         |  entry  |
+---------+---------+
| ListView here to  |
| select data item  |
| for top two panes |
+---------+---------+

وهذا كله يعمل بشكل جيد، ولكن أود الآن لتغيير الصورة إلى مجموعة أخرى من الضوابط قائلا "عذرا، لا تتوفر صورة" عندما لا يكون العنصر المحدد في ListView صورة

ولقد حاول التفاف الصورة في DockPanel ووضع DataTemplate هناك (حتى أتمكن من استخدام DataTriggers) لكن التحسس الذكي يقول لا!

ويكون ListView يستخدم DataTriggers أن تفعل شيئا مماثلا، ولكن كما قلت لا أستطيع الحصول على رأسي الجولة كيف نفعل ذلك للحصول على صورة واحدة لا يبدو أن لديها إمكانية الوصول إلى DataTemplate.

والمبسطة XAML أقل؛

<Grid DataContext="{Binding Source={StaticResource MyData}}">
   <!-- row 0 col 0 -->
   <Image x:Name="imgPhoto" Source="{Binding ElementName=MyListViewOfData, Path=SelectedItem.PathToImageOnDisk}" />

   <!-- row 0 col 1 -->
   <StackPanel DataContext="{Binding ElementName=MyListViewOfData, Path=SelectedItem}">
      <TextBox Name="NameTextBox" Text="{Binding Name}" />
      <TextBlock Name="DateCreatedTextBlock" Text="{Binding DateCreated}" />
   </StackPanel>

   <!-- row 1 cols 0,1 -->
   <ListView ItemsSource="{Binding}" ItemTemplate="{StaticResource MyListViewTemplate}" 
IsSynchronizedWithCurrentItem="True" Name="MyListViewOfData" />

</Grid>

وشكرا مقدما معلمو برنامج الأغذية العالمي.

وريان

وتحديث: وكانت كل الإجابات أدناه (آبي وJobi) بقعة على، وذلك بفضل

هل كانت مفيدة؟

المحلول

في أجل استخدام DataTemplate، يكون لديك عنصر تحكم يستخدم القالب لتقديم كائن. إذا كنت تستخدم ContentPresenter، يمكنك تعيين ContentTemplate ليكون DataTemplate إلى ما تريد.

وهنا هو كيف لي أن تفعل هذا:

<Grid DataContext="...">
    <ContentPresenter Content="{Binding SelectedItem, ElementName=MyListViewOfData}">
        <ContentPresenter.ContentTemplate>
            <DataTemplate>
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition />
                        <ColumnDefinition />      
                    </Grid.ColumnDefinitions>
                    <Image x:Name="imgPhoto" Source="{Binding PathToImageOnDisk}" />
                    <TextBlock x:Name="error" Visibility="Collapsed" Text="Sorry, no image available" />
                    <StackPanel Grid.Column="1">
                        <TextBox Name="NameTextBox" Text="{Binding Name}" />
                        <TextBlock Name="DateCreatedTextBlock" Text="{Binding DateCreated}" />
                    </StackPanel>
                </Grid>
            <DataTemplate.Triggers>
                <DataTrigger Binding="{Binding PathToImageOnDisk}" Value="{x:Null}">
                    <Setter TargetName="imgPhoto" Property="Visibility" Value="Collapsed" />
                    <Setter TargetName="error" Property="Visibility" Value="Visible" />
                </DataTrigger>
            </DataTemplate.Triggers>
            </DataTemplate>
        </ContentPresenter.ContentTemplate>
    </ContentPresenter>
    <ListView ItemsSource="{Binding}" ItemTemplate="{StaticResource MyListViewTemplate}" IsSynchronizedWithCurrentItem="True" Name="MyListViewOfData" />

</Grid>

نصائح أخرى

ويمكنك أن تفعل خدعة سهلة هنا، إذا كنت لا تشعر بالقلق إزاء مرئيات الحصول إنشاؤها في شجرة البصرية WPF. فقط ضع عنصر تحكم صورة على أعلى من السيطرة "غير متوفر" بحيث في أي وقت التحميل صورة يحصل فشلت هل سيكون قادرا على رؤية رسالة رفع الصوت عاليا. إذا نجحت تحكم صورة ثم "غير متوفر" الحصول على تتداخل رسالة من صورة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top