mengikat gambar kotak kombo - cara memilih item yang disimpan dalam gambar kotak kombo

Saya mempunyai Masalah dengan ComboBox di wpf dan xaml. ItemsSource dari kotak kombo saya adalah daftar (CollarTypesImage). pengikatannya berfungsi dengan baik tetapi masalah saat mengedit data, saya tidak dapat memilih item dari ComboBox saya.. mungkin sudah dipilih tetapi gambarnya tidak terlihat...

tetapi ketika mengklik ComboBox, saya dapat melihat semuanya:

http://www.ahmadabouhamdh.com/tmp_global/1.png

saya menggunakan RelativeSource , tidak ada yang berubah, ComboBox tidak memilih item yang saya simpan:

<UserControl x:Class="TailorManager.Views.OrderDetailItem"
         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" 
   xmlns:vm="clr-namespace:TailorManager.ViewModels" 
  xmlns:Converter="clr-namespace:TailorManager.Converters"
         mc:Ignorable="d" 
         d:DesignHeight="730" d:DesignWidth="556" FlowDirection="RightToLeft" >
<UserControl.Resources>
    <!--<vm:OrderDetailItemViewModel x:Key="OrderDetailItemViewModel1" />-->
    <Converter:ImageConverter x:Key="ImgConverter" />
</UserControl.Resources>
<Grid >
    <ScrollViewer VerticalScrollBarVisibility="Auto" >
        <ItemsControl>
            <StackPanel> 
                <GroupBox Header="تفاصيل الياقة" Margin="5,5,5,0" VerticalAlignment="Top" Height="170">
                    <Grid>
                       <ComboBox ItemsSource="{Binding Path= DataContext.ImagesCollarTypes,
                            RelativeSource={RelativeSource AncestorType=UserControl,AncestorLevel=1}}" 
                                  SelectedValue="{Binding Path=OrderDetailItem.CollarTypesImage,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"  
                                  SelectedValuePath="{Binding Path=OrderDetailItem.CollarTypesImage}"
                                  Margin="393,106,0,0" VerticalAlignment="Top" HorizontalAlignment="Left" Width="132" Height="38">
                            <ComboBox.ItemTemplate>
                                <DataTemplate>
                                    <Image Width="50" Height="50" Source="{Binding Path= CollarImage,Converter={StaticResource ImgConverter} }" />
                                </DataTemplate>
                            </ComboBox.ItemTemplate >
                        </ComboBox>

                    </Grid>
                </GroupBox> 
                <Grid/>
            </StackPanel>

        </ItemsControl>
    </ScrollViewer>
</Grid>
</UserControl>

saya tambahkan

 SelectedItem="{Binding Path=OrderDetailItem.CollarTypesImage}"

dan tidak ada yang berubah.

saya menggunakan Kontrol di dalam jendela ini memiliki tipe DataContext yang berbeda, saya menetapkan nilai (DataContext OrderDetailItem) dari konstruktor kontrol ini.

gambar di bawah menjelaskan pengikatannya berfungsi dengan baik:

gambar ini ketika klik edit untuk menampilkan gambar saya yang disimpan dari DB, item saya tidak dipilih:

http://www.ahmadabouhamdh.com/tmp_global/2.png

di sini semua kodenya:

    public List<CollarTypesImage> ImagesCollarTypes
    {
        get
        {
            //ImagesCollarTypes[0].CollarImage
            if (_imagesCollarTypes.Count == 0)
            {
                TailorManagerDBEntities db = new TailorManagerDBEntities();
                _imagesCollarTypes = db.CollarTypesImages.ToList();
            }
            return _imagesCollarTypes;
        }
        set
        {
            _imagesCollarTypes = value;
            RaisePropertyChanged(() => ImagesCollarTypes);
        }
    }

public partial class CollarTypesImage
{
    public CollarTypesImage()
    {
        this.OrderDetails = new HashSet<OrderDetail>();
    }

    public System.Guid CollarTypeId { get; set; }
    public byte[] CollarImage { get; set; }

    public virtual ICollection<OrderDetail> OrderDetails { get; set; }
}

di sini kode xaml dari jendela saya menggunakan kontrol saya:

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
   xmlns:vm="clr-namespace:TailorManager.ViewModels"
    xmlns:util="clr-namespace:TailorManagerLib.Business;assembly=TailorManagerLib"
    xmlns:local="clr-namespace:TailorManager.Views"
x:Class="TailorManager.Views.AddOrder"
    Title="AddCustomer" Height="665" Width="974" MinWidth="600" MinHeight="666" FlowDirection="RightToLeft" >
<Window.Resources>
    <vm:ManageOrderDetilsViewModel x:Key="ManageOrderDetilsViewModel1" />
</Window.Resources>
<Grid DataContext="{StaticResource ManageOrderDetilsViewModel1}" x:Name="GridDataContaner">
    <Grid.Background>
       ...
    </Grid.Background>

    <GroupBox Header="تفاصيل الطلب" Margin="10,160,10,0" FlowDirection="RightToLeft">
        <Grid Grid.Column="0" Name="GridOrderDetails">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Name="ColumnDefinitionListDetails" Width="183*"/>
                <ColumnDefinition Name="ColumnDefinitionDetails" Width="0*"/>
            </Grid.ColumnDefinitions>
            <Grid Margin="0,0,0,40" >
               ...
            </Grid>
            <Grid Grid.Column="1">
                <Border BorderBrush="Black" BorderThickness="2" CornerRadius="3" Margin="4" >
                    <Grid>
                       <local:OrderDetailItem x:Name="OrderDetailItemControl" VerticalAlignment="Top" />
                    </Grid>
                </Border>

            </Grid>
            ...
        </Grid>
    </GroupBox>

</Grid>
</Window>

bagaimana saya mengatur DataContext dari Kontrol, ini di dalam perintah di VM jendela saya:

OrderDetailItemViewModel OrdDetailItem = new OrderDetailItemViewModel(Ord.OrderDetailsId);
OrderDetailItemControl.DataContext = OrdDetailItem;

Tolong bagaimana cara memperbaikinya??


MEMPERBARUI

ketika saya mengubah sumber relatif seperti di bawah ini:

<ComboBox Name="CmbBxImgCollarTyp" ItemsSource="{Binding Path= DataContext.ImagesCollarTypes, RelativeSource={
RelativeSource AncestorType={x:Type vm:OrderDetailItemViewModel}}" 
SelectedValue="{Binding Path=OrderDetailItem.CollarTypesImage, Mode=TwoWay,
UpdateSourceTrigger=PropertyChanged}" SelectedValuePath="{Binding Path= OrderDetailItem.CollarTypesImage}" Margin="393,106,0,0" VerticalAlignment="Top" 
HorizontalAlignment="Left" Width="132" Height="38">
                            <ComboBox.ItemTemplate>
                                <DataTemplate>
                                    <Image Width="50" Height="50" Source="{Binding Path=CollarImage,
            Converter={StaticResource ImgConverter}}" />
                                </DataTemplate>
                            </ComboBox.ItemTemplate>
                        </ComboBox>

pengikatan tidak pernah berfungsi sama sekali mode!, saya mengubahnya dengan cara ini karena konteks data kontrol ini adalah objek model tampilan "OrderDetailItemViewModel" Apa yang harus diperbaiki؟؟


person Ahmad Abou Hamdh    schedule 25.06.2014    source sumber


Jawaban (2)


Anda mengalami kesalahan di RelativeSource Binding Path Anda. Anda telah menggunakan tipe UserControl, namun kelas UserControl tidak memiliki properti bernama ImagesCollarTypes... sebagai gantinya, Anda harus menggunakan Anda UserControl di mana Anda mendefinisikan properti tersebut.. Saya berasumsi kelas itu bernama OrderDetailItem:

<ComboBox ItemsSource="{Binding Path= DataContext.ImagesCollarTypes, RelativeSource={
    RelativeSource AncestorType={x:Type YourViewsPrefix:OrderDetailItem}}}" 
    SelectedValue="{Binding Path=CollarTypesImage, Mode=TwoWay,
    UpdateSourceTrigger=PropertyChanged}" SelectedValuePath="{Binding Path=
    CollarTypesImage}" Margin="393,106,0,0" VerticalAlignment="Top" 
    HorizontalAlignment="Left" Width="132" Height="38">
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <Image Width="50" Height="50" Source="{Binding Path=CollarImage,
                Converter={StaticResource ImgConverter}}" />
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>

Anda seharusnya menerima kesalahan di Jendela Output di Visual Studio yang mengatakan sesuatu seperti Error: property 'ImagesCollarTypes' not found on object 'UserControl' atau yang serupa.

Penafian: Saya tidak memeriksa semua kode Anda karena Anda memiliki terlalu banyak kode di sana, jadi meskipun Anda memperbaiki kesalahan ini, kode Anda mungkin masih memiliki kesalahan lain dan tidak berfungsi seperti yang diharapkan.


PEMBARUAN >>>

Agar Binding ini berfungsi, asumsi berikut dibuat:

  1. UserControl.DataContext harus memiliki instance kumpulan objek yang valid.
  2. Objek yang ditetapkan sebagai UserControl.DataContext harus memiliki properti publik bernama ImagesCollarTypes.
  3. Properti ImagesCollarTypes harus bertipe yang berisi properti publik bernama CollarTypesImage.
person Sheridan    schedule 25.06.2014
comment
hai Sheridan, Terima kasih banyak telah memutar ulang.. sebenarnya saya tidak menerima kesalahan apa pun ... saya mengatur pembaruan Anda dan tidak ada perubahan! Saya masih memiliki masalah yang sama - person Ahmad Abou Hamdh; 25.06.2014
comment
sebenarnya saya tidak menerima kesalahan apa pun... bagaimana bisa? Anda mengalami kesalahan Binding yang jelas. Pernahkah Anda melihat kesalahan di Jendela Output Anda? Mungkin pilihan tersebut tidak ada dalam pilihan Anda. Apa pun yang terjadi, saya memperbarui kodenya... lihat lagi. - person Sheridan; 25.06.2014
comment
sungguh, tidak ada kesalahan.. silakan periksa gambarnya.. ahmadabouhamdh.com/tmp_global/3.png ahmadabouhamdh.com/tmp_global/4.png - person Ahmad Abou Hamdh; 25.06.2014
comment
Mengapa tunjukkan UI Anda untuk membuktikan bahwa Anda tidak memiliki kesalahan di Jendela Output di Visual Studio? Mereka tidak ditampilkan di UI, mereka ditampilkan di Jendela Output di Visual Studio. - person Sheridan; 25.06.2014
comment
Sheridan, DataContext dari UserControl OrderDetailItem adalah objek baru dari viewmodel OrderDetailItemViewModel, dan konstruktor ini dibuat seperti ini: public OrderDetailItemViewModel(Guid OrderDetailID) { if (OrderDetailID != Guid.Empty) { TailorManagerDBEntities db = new TailorManagerDBEntities(); OrderDetailItem = db.OrderDetails.SingleOrDefault(q =› q.OrderDetailsId == OrderDetailID); } } Properti OrderDetailID ini adalah milik umum - person Ahmad Abou Hamdh; 25.06.2014
comment
Mohon jangan menambahkan kode ke dalam komentar karena sangat sulit untuk melihatnya dengan jelas. Jika Anda harus menambahkan kode, Anda harus menambahkannya ke pertanyaan Anda di edit. Karena itu, saya benar-benar tidak yakin mengapa Anda menampilkan kode konstruktor - sepertinya tidak relevan bagi saya. Itu berarti tabel database OrderDetails Anda memiliki properti bernama OrderDetailID di dalamnya. Apa pun yang terjadi... kesalahan apa yang Anda dapatkan di Jendela Output di Visual Studio? - person Sheridan; 25.06.2014
comment
ini adalah Output Kesalahan: Kesalahan Sistem.Windows.Data: 40: Kesalahan jalur BindingExpression: properti 'TailorManagerLib' tidak ditemukan pada 'objek' ''CollarTypesImage' (HashCode=8694740)'. BindingExpression:Path=TailorManagerLib.DB.CollarTypesImage; DataItem='CollarTypesImage' (Kode Hash=8694740); elemen target adalah 'ComboBox' (Nama='CmbBxImgCollarTyp'); properti target adalah 'NoTarget' (ketik 'Objek') - person Ahmad Abou Hamdh; 25.06.2014
comment
Anda bahkan belum menunjukkan kode yang relevan. Kesalahan Anda mengeluh tentang properti bernama TailorManagerLib, tetapi kode Anda tidak menunjukkan di mana Anda mencoba mengikat data menggunakannya. (Saya sangat menyadari bahwa ini adalah Namespace Anda, tetapi kesalahan Anda mengatakan bahwa Anda telah menggunakannya di suatu tempat di XAML Anda). Kamu perlu melakukan beberapa pekerjaan sendiri sekarang... Aku lelah terus-menerus kembali ke sini untuk membuang-buang waktu. Jika Anda memerlukan bantuan lebih lanjut, sebaiknya berikan semua informasi yang relevan (dan hanya informasi yang relevan) dalam pertanyaan Anda. Anda belum melakukan ini sejauh ini. - person Sheridan; 25.06.2014
comment
Terima kasih banyak atas usaha dan waktu Anda, saya akan mencoba memahami masalah ini - person Ahmad Abou Hamdh; 25.06.2014
comment
Untuk lebih jelasnya, saya tidak mengatakan bahwa saya tidak akan membantu Anda lebih jauh... Saya hanya ingin Anda memberi saya semua informasi yang relevan untuk saya dapat memperbaiki masalah Anda. Dan sebaiknya sekaligus, tidak sedikit di sini dan sedikit di sana. - person Sheridan; 25.06.2014

setelah memeriksa jendela Output, saya mencatat kesalahan ini:

System.Windows.Data Error: 4 : Cannot find source for binding with 
reference 'RelativeSource FindAncestor, AncestorType='Projectname.ViewModels.ViewModel', AncestorLevel='1''. BindingExpression:Path=LookupItems; DataItem=null; target element is 'ComboBox' (Name=''); target property is 'ItemsSource' (type 'IEnumerable')

lalu saya mengubah RelativeSource dari LeluhurType dari ViewModel saya ke UserControl, seperti ini: RelativeSource={ AncestorType={x:Type UserControl},AncestorLevel=1}}"

dan sekarang semuanya berfungsi dengan baik,

Terima kasih atas upaya anggota

person Ahmad Abou Hamdh    schedule 26.06.2014