Как привязать данные из словаря к xaml и использовать выбранный объект - PullRequest
0 голосов
/ 07 мая 2018

CategoriesView.xaml

<local:AllViewBase x:Class="Test.View.Tab.CategoriesView"
             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:local="clr-namespace:Test.View.Abstract"
             mc:Ignorable="d">

    <UserControl.Resources>
        <ResourceDictionary Source="pack://application:,,,/Content/Style/MainWindowDictionary.xaml"/>
    </UserControl.Resources>

    <Grid>
        <ListBox ItemsSource="{Binding Path=dcCategory}" SelectedItem="{Binding Path=Category,Mode=TwoWay}">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel>
                        <StackPanel Orientation="Horizontal" >
                            <Button Content="Add Value" Command="{Binding Path=DataContext.AddValue, RelativeSource= {RelativeSource FindAncestor, AncestorType={x:Type ListBox}}}"/>
                            <TextBlock Text="{Binding Path=Key}"/>
                        </StackPanel>
                        <ListBox ItemsSource="{Binding Path=Value}" />
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
            <ListBox.ItemsPanel>
                <ItemsPanelTemplate>
                    <StackPanel Orientation="Horizontal" />
                </ItemsPanelTemplate>
            </ListBox.ItemsPanel>
        </ListBox>
    </Grid> 
</local:AllViewBase>

CategoriesViewModel.cs

namespace Test.ViewModel.Tab
{
    public class CategoriesViewModel : AllViewModel<CategoryValueAllView>
    {
        private BaseCommand _AddValue;

        private Category _Category;
        public Category Category
        {
            get
            {
                return _Category;
            }
            set
            {
                if (_Category != value)
                {
                    _Category = value;
                    OnPropertyChanged(() => Category);
                }
            }
        }

        private Dictionary<Category, List<string>> _dcCategory;
        public Dictionary<Category, List<string>> dcCategory
        {
            get
            {
                if (_dcCategory == null) LoadDictionary();
                return _dcCategory;
            }
            set
            {
                if (_dcCategory != value)
                {
                    _dcCategory = value;
                    OnPropertyChanged(() => dcCategory);
                }
            }
        }

        public ICommand AddValue
        {
            get
            {
                if (_AddValue == null)
                {
                    _AddValue = new BaseCommand(() => Messenger.Default.Send(CategoryValueCode.AddValue + "," + Category.CategoryId));
                }
                return _AddValue;
            }
        }

        public void LoadDictionary()
        {
            dcCategory = (from k in db.Category join w in db.CategoryVal on k.CategoryId equals w.CategoryId select new CategoryValueAllView { Category = w.Category, Val = w.Val }).GroupBy(x => x.Category).ToDictionary(grp => grp.Key, grp => grp.Select(obj => obj.Val).ToList());
        }
    }
}

Мои цели:

  • <TextBlock Text="{Binding Path=Key}"/> показать Category.Name. Я не знать, как использовать Key как объект и использовать свойство Name
  • когда я нажимаю кнопку «Добавить значение», я хочу установить «CategoryId» в объекте «Category» и отправить его через команду «AddValue» Коммуникатор

Ранее я использовал строковое имя category.name вместо объекта категории для ключа словаря. Затем <TextBlock Text="{Binding Path=Key}"/> показывает правильное имя, но в конце концов я не смог передать команду «category.name» команде «AddValue» после нажатия кнопки, чтобы получить идентификатор по имени и установить данные с помощью Messenger.

Получение идентификатора по имени также допустимо, объект Category в качестве ключа не требуется

Несмотря ни на что, я хотел бы узнать это, но не могу вынести пример, который показал такую ​​проблему

Спасибо!

1 Ответ

0 голосов
/ 07 мая 2018
  1. Использовать Key.Name для привязки к TextBlock
  2. Для привязки к списку у вас есть два способа:

-Использование выбранного элемента. У вас уже есть свойство "Категория" в вашей модели просмотра. Свяжите это свойство с выбранным элементом списка. Затем вы можете использовать Category.CategoryID в вашей команде AddValue.

<ListBox ItemsSource = "{Binding Path = dcCategory}" SelectedItem = "{Binding Path = Category, Mode = TwoWay}">

-Используйте выбранное значение. SelectedCategoryId должен быть свойством модели представления. Затем вы можете напрямую использовать это свойство в вашей команде AddValue.

<ListBox ItemsSource = "{Binding Path = dcCategory}" SelectedValuePath = "CategoryId" SelectedValue = "{Binding Path = SelectedCategoryId, Mode = TwoWay}">
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...