Получить выбранный элемент ListBox MVVM - PullRequest
0 голосов
/ 03 мая 2018

Я просто сделал следующее:

public string  X
{
    get { return _X; }
    set
    {
        _X= value;
        NotifyOfPropertyChange("X");
    }
}

XAML:

<ListBox SelectedItem="{Binding X}" Grid.Row="0" Grid.Column="2" SelectedIndex="0" Margin="0 10 0 0">
    <ListBox.Resources>
        <Style TargetType="{x:Type ListBoxItem}" BasedOn="{StaticResource MaterialDesignToolToggleListBoxItem}">
            <Setter Property="Padding" Value="8 12 8 12" />
        </Style>
    </ListBox.Resources>

    <ListBoxItem>
        <TextBlock Text="TEXT1"/>
    </ListBoxItem>
    <ListBoxItem>
        <TextBlock Text="TEXT2"/>
    </ListBoxItem>
    <ListBoxItem>
        <TextBlock Text="TEXT3"/>
    </ListBoxItem>
</ListBox>

Вместо того, чтобы получать только предмет, я получаю следующее:

System.Windows.Controls.ListBoxItem: SELECTED_ITEM_HERE

Ответы [ 3 ]

0 голосов
/ 04 мая 2018

Вместо указания элементов списка непосредственно в xaml, вы можете привязать эти значения к элементу источника.

Я попробовал следующий фрагмент кода

  public Class1()
        {
            TextList = new ObservableCollection<string> { "TEXT1", "TEXT2" };
        }
        private string _X;
        public string X
        {
            get { return _X; }
            set
            {
                _X = value;
                if (PropertyChanged != null)
                    PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("X"));
            }
        }
        public ObservableCollection<string> TextList { get; set; }
        public event PropertyChangedEventHandler PropertyChanged;

в xaml,

<ListBox SelectedItem="{Binding X}" ItemsSource="{Binding TextList}"/>

с этим я получаю только "TEXT2" / "TEXT1" вместо этого с типом управления.

0 голосов
/ 04 мая 2018

Вместо добавления ListBoxItems к ListBox, вы должны добавить strings к нему:

<ListBox SelectedItem="{Binding X}" Grid.Row="0" Grid.Column="2" SelectedIndex="0" Margin="0 10 0 0"
         xmlns:s="clr-namespace:System;assembly=mscorlib">
    <ListBox.Resources>
        <Style TargetType="{x:Type ListBoxItem}" BasedOn="{StaticResource MaterialDesignToolToggleListBoxItem}">
            <Setter Property="Padding" Value="8 12 8 12" />
        </Style>
    </ListBox.Resources>
    <s:String>TEXT1</s:String>
    <s:String>TEXT2</s:String>
    <s:String>TEXT3</s:String>
</ListBox>

Другой вариант - изменить тип исходного свойства на ListBoxItem, но это не то, что вам нужно. Тип элемента и свойство источника свойства, с которым вы связываете SelectedItem, должны совпадать.

0 голосов
/ 03 мая 2018

Вы должны разыграть текстовый блок и установить _x текст

private string _X;
public object X
{
    get { return _X; }
    set
     {
        var a = ((ListBoxItem)value).Content as TextBlock;
        _X = a.Text;
       NotifyOfPropertyChange("X");
     }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...