связывание изображений со списком - как выбрать сохраненный элемент в изображениях со списком

У меня проблема с 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) из конструктора этого элемента управления.

изображение ниже объясняет, что привязка работает нормально:

это изображение при нажатии кнопки «Изменить», чтобы показать мое сохраненное изображение из БД, мой элемент не выбран:

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 элемента управления, это внутри команды в виртуальной машине моего окна:

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>

привязка никогда не работает во всех режимах!, я меняю ее на этот способ, потому что контекст данных этого элемента управления является объектом модели представления "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
на самом деле, никаких ошибок.. пожалуйста, проверьте изображения.. /a> ahmadabouhamdh.com/tmp_global/4.png - person Ahmad Abou Hamdh; 25.06.2014
comment
Зачем показывать мне свой пользовательский интерфейс, чтобы доказать отсутствие ошибок в окне вывода в Visual Studio? Они не отображаются в пользовательском интерфейсе, они отображаются в окне вывода в Visual Studio. - person Sheridan; 25.06.2014
comment
Шеридан, DataContext элемента управления UserControl OrderDetailItem — это новый объект из модели представления OrderDetailItemViewModel, и этот конструктор строится следующим образом: 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 Error: 40: ошибка пути BindingExpression: свойство «TailorManagerLib» не найдено в «объекте» «CollarTypesImage» (HashCode = 8694740)». BindingExpression:Path=TailorManagerLib.DB.CollarTypesImage; DataItem='CollarTypesImage' (HashCode=8694740); целевой элемент — «ComboBox» (Name = «CmbBxImgCollarTyp»); целевое свойство — «NoTarget» (тип «Объект») - 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

после проверки окна Вывод я замечаю эту ошибку:

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