การผูกภาพคอมโบบ็อกซ์ - วิธีเลือกรายการที่บันทึกไว้ในภาพคอมโบบ็อกซ์

ฉันมีปัญหากับ ComboBox ที่ wpf และ xaml ItemsSource ของคอมโบบ็อกซ์ของฉันคือรายการของ (CollarTypesImage) การผูกใช้งานได้ดี แต่มีปัญหาในการแก้ไขข้อมูล ฉันไม่สามารถเลือกรายการใน ComboBox ของฉันได้.. อาจจะเลือกไว้แล้วแต่รูปภาพไม่ได้ดู...

แต่เมื่อคลิก ComboBox ฉันจะเห็นมันทั้งหมด:

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

ฉันใช้ RelativeSource ไม่มีอะไรเปลี่ยนแปลง ComboBox ไม่ได้เลือกรายการที่บันทึกไว้:

<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>

ฉันเพิ่ม

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

และไม่มีอะไรเปลี่ยนแปลง

ฉันใช้การควบคุมภายในหน้าต่างนี้มีประเภท DataContext ที่แตกต่างกัน ฉันตั้งค่า (DataContext OrderDetailItem) จากตัวสร้างของการควบคุมนี้

ภาพด้านล่างอธิบายว่าการเข้าเล่มทำงานได้ดี:

รูปภาพนี้เมื่อคลิกแก้ไขเพื่อแสดงรูปภาพที่บันทึกไว้จาก DB รายการของฉันไม่ได้เลือก:

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

นี่คือรหัสทั้งหมด:

    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; }
}

นี่คือรหัส xaml จากหน้าต่างที่ฉันใช้การควบคุม:

<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>

ฉันจะตั้งค่า DataContext ของ Control ได้อย่างไร ซึ่งอยู่ภายในคำสั่งใน VM ของหน้าต่างของฉัน:

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

กรุณาแก้ไขอย่างไรคะ??


อัปเดต

เมื่อฉันเปลี่ยนแหล่งสัมพัทธ์ดังนี้:

<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>

การเชื่อมโยงไม่ทำงานในทุกโหมด! ฉันเปลี่ยนด้วยวิธีนี้ทำให้บริบทข้อมูลของการควบคุมนี้เป็นออบเจ็กต์ของ viewmodel "OrderDetailItemViewModel" สิ่งที่ควรแก้ไข;


person Ahmad Abou Hamdh    schedule 25.06.2014    source แหล่งที่มา


คำตอบ (2)


คุณมีข้อผิดพลาดใน RelativeSource Binding Path ของคุณ คุณได้ใช้ประเภท UserControl แล้ว แต่คลาส UserControl ไม่ มีคุณสมบัติชื่อ ImagesCollarTypes... แทน คุณควรใช้ ของคุณ UserControl โดยที่คุณกำหนดคุณสมบัติ.. ฉันสมมติว่าคลาสนั้นมีชื่อว่า 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>

คุณควรได้รับข้อผิดพลาดในหน้าต่างเอาท์พุตใน Visual Studio โดยบอกว่า ข้อผิดพลาด: ไม่พบคุณสมบัติ 'ImagesCollarTypes' บนวัตถุ 'UserControl' หรืออะไรที่คล้ายกัน

ข้อจำกัดความรับผิดชอบ: ฉันไม่ได้อ่านโค้ดของคุณทั้งหมดเพราะว่าคุณมีโค้ดมากเกินไป ดังนั้นแม้ว่าคุณจะแก้ไขข้อผิดพลาดนี้แล้ว โค้ดของคุณก็อาจมีข้อผิดพลาดอื่นๆ และไม่ทำงานตามที่คาดไว้


อัพเดท >>>

เพื่อให้ Binding นี้ใช้งานได้ มีการตั้งสมมติฐานต่อไปนี้:

  1. UserControl.DataContext ต้องมีอินสแตนซ์ที่ถูกต้องของชุดอ็อบเจ็กต์
  2. อ็อบเจ็กต์ที่ตั้งค่าเป็น UserControl.DataContext ต้องมีทรัพย์สินสาธารณะชื่อ ImagesCollarTypes
  3. คุณสมบัติ ImagesCollarTypes ต้องเป็นประเภทที่มีคุณสมบัติสาธารณะชื่อ CollarTypesImage
person Sheridan    schedule 25.06.2014
comment
สวัสดีเชอริแดน ขอบคุณมากสำหรับการเล่นซ้ำ.. จริงๆ แล้วฉันไม่ได้รับข้อผิดพลาดใดๆ ... ฉันตั้งค่าการอัปเดตของคุณแล้วและไม่มีการเปลี่ยนแปลง! ฉันยังคงมีปัญหาเดียวกัน - person Ahmad Abou Hamdh; 25.06.2014
comment
จริงๆ แล้วไม่ได้รับข้อผิดพลาดใดๆ... เป็นไปได้อย่างไร? คุณมีข้อผิดพลาด Binding ที่ชัดเจน คุณเคยเห็นข้อผิดพลาดใด ๆ ในหน้าต่างเอาท์พุตของคุณหรือไม่? บางทีตัวเลือกของคุณอาจถูกปิดอยู่ ไม่ว่าจะด้วยวิธีใด ฉันได้อัปเดตโค้ดแล้ว... ลองดูอีกครั้ง - person Sheridan; 25.06.2014
comment
จริงๆ ไม่มีข้อผิดพลาด.. โปรดตรวจสอบ iamges.. ahmadabouhamdh.com/tmp_global/3.png ahmadabouhamdh.com/tmp_global/4.png - person Ahmad Abou Hamdh; 25.06.2014
comment
เหตุใดจึงต้องแสดง UI ของคุณเพื่อพิสูจน์ว่าคุณไม่มีข้อผิดพลาดใน หน้าต่างเอาท์พุตใน Visual Studio ไม่แสดงใน UI แต่แสดงใน หน้าต่างเอาท์พุตใน Visual Studio - person Sheridan; 25.06.2014
comment
Sheridan, DataContext ของ UserControl OrderDetailItem เป็นอ็อบเจ็กต์ใหม่จาก viewmodel OrderDetailItemViewModel และ Constructor นี้สร้างดังนี้: public OrderDetailItemViewModel(Guid OrderDetailID) { if (OrderDetailID != Guid.Empty) { TailorManagerDBEntities db = new TailorManagerDBEntities(); OrderDetailItem = db.OrderDetails.SingleOrDefault(q =› q.OrderDetailsId == OrderDetailID); } } คุณสมบัติ OrderDetailID นี้เป็นทรัพย์สินสาธารณะ - person Ahmad Abou Hamdh; 25.06.2014
comment
โปรดอย่าเพิ่มโค้ดลงในความคิดเห็นเนื่องจากมองเห็นได้ชัดเจนยากมาก หากคุณต้องเพิ่มโค้ด คุณควรเพิ่มลงในคำถามของคุณในการแก้ไข ต้องบอกว่าฉันไม่แน่ใจจริงๆว่าทำไมคุณถึงแสดงโค้ดคอนสตรัคเตอร์ของคุณ - ดูเหมือนว่าไม่เกี่ยวข้องกับฉันเลย นั่นก็หมายความว่าตารางฐานข้อมูล OrderDetails ของคุณมีคุณสมบัติชื่อ OrderDetailID อยู่ในนั้น ไม่ว่าจะด้วยวิธีใด ... คุณได้รับข้อผิดพลาดอะไร ในหน้าต่างเอาท์พุตใน Visual Studio - person Sheridan; 25.06.2014
comment
นี่คือผลลัพธ์ข้อผิดพลาด: ข้อผิดพลาด System.Windows.Data: 40 : ข้อผิดพลาดเส้นทาง BindingExpression: ไม่พบคุณสมบัติ 'TailorManagerLib' บน 'วัตถุ' ''CollarTypesImage' (HashCode=8694740)' BindingExpression:Path=TailorManagerLib.DB.CollarTypesImage; DataItem='CollarTypesImage' (HashCode=8694740); องค์ประกอบเป้าหมายคือ 'ComboBox' (ชื่อ = 'CmbBxImgCollarTyp'); คุณสมบัติเป้าหมายคือ 'NoTarget' (ประเภท 'Object') - person Ahmad Abou Hamdh; 25.06.2014
comment
คุณยังไม่ได้แสดงรหัสที่เกี่ยวข้องด้วยซ้ำ ข้อผิดพลาดของคุณบ่นเกี่ยวกับคุณสมบัติชื่อ TailorManagerLib แต่โค้ดของคุณไม่แสดงว่าคุณพยายามผูกข้อมูลโดยใช้คุณสมบัตินั้นที่ใด (ฉันทราบดีว่าเป็นเนมสเปซของคุณ แต่ข้อผิดพลาดของคุณบอกว่าคุณได้ใช้มันที่ไหนสักแห่งใน XAML ของคุณ) คุณต้องทำงานด้วยตัวเองตอนนี้... ฉันเหนื่อยที่ต้องกลับมาที่นี่เพื่อเสียเวลาอีกต่อไป หากคุณต้องการความช่วยเหลือเพิ่มเติม คุณควรให้ข้อมูลที่เกี่ยวข้องทั้งหมด (และเฉพาะข้อมูลที่เกี่ยวข้อง) ในคำถามของคุณ คุณยังไม่ได้ทำสิ่งนี้จนถึงตอนนี้ - person Sheridan; 25.06.2014
comment
ขอบคุณมากสำหรับความพยายามและเวลาของคุณ ฉันจะพยายามเข้าใจปัญหานี้ - person Ahmad Abou Hamdh; 25.06.2014
comment
เพื่อความชัดเจน ฉันไม่ได้ ไม่ กำลังบอกว่าจะไม่ช่วยเหลือคุณอีกต่อไป... ฉันแค่ต้องการให้คุณให้ข้อมูล ทั้งหมด ที่เกี่ยวข้องแก่ฉันเพื่อ สามารถแก้ไขปัญหาของคุณได้ และโดยเฉพาะอย่างยิ่งในคราวเดียว ไม่ใช่ตรงนี้สักหน่อย - person Sheridan; 25.06.2014

หลังจากตรวจสอบหน้าต่าง Output แล้ว ฉันบันทึกข้อผิดพลาดนี้:

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')

จากนั้นฉันเปลี่ยน RelativeSource จาก AncestorType จาก ViewModel ของฉันเป็น UserControl เช่นนี้: RelativeSource={ AncestorType={x:Type UserControl},AncestorLevel=1}}"

และตอนนี้ทุกอย่างทำงานได้ดี

ขอบคุณสำหรับสมาชิกที่พยายาม

person Ahmad Abou Hamdh    schedule 26.06.2014