Привязка данных не обновляется при «очистке» ObservableCollection строк - PullRequest
0 голосов
/ 12 мая 2019

У меня есть Windows, которая содержит два списка и одну кнопку. Эти два списка данных привязываются к списку класса «ObjectList» и включают в себя ObservableCollection. Первый ListBox (назовем его «ObjectLists») содержит текстовое поле. Второй ListBox (назовем его «ObjectListsSelected») содержит в себе Listbox. Я использую эти верхние списки, чтобы получить динамический интерфейс.

Кнопка выполняет команду, которая используется для разделения текста в первом списке (следуйте \ r \ n символам), добавления их во второе поле списка и очистки текстового поля в первом списке.

У меня проблема с привязкой данных для "объектных списков". Параметр «Очистить» не отображается в пользовательском интерфейсе, хотя свойство получает это обновление.

При отладке этого сценария я обнаружил, что действие «Очистить» не распространяется на набор свойств. Конечно, я использовал изменение свойства, но ничего не работает.

Главное окно

<Window x:Class="WpfApp1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:WpfApp1"
    mc:Ignorable="d"
    Title="MainWindow" Height="450" Width="800">
<Window.Resources>
    <local:ListToTextConverter x:Key="converter1"></local:ListToTextConverter>
</Window.Resources>
<Grid Name="ObjPanel">
    <Grid.RowDefinitions>
        <RowDefinition />
        <RowDefinition/>
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition/>
        <ColumnDefinition/>
        <ColumnDefinition/>
    </Grid.ColumnDefinitions>
    <Label Content="Object" Height="30"/>
    <ListBox Name="ObjectLists" Grid.Row="1" Grid.Column="0" ItemsSource="{Binding OB1,Mode=TwoWay}" BorderThickness="0" Background="Transparent" Width="200" HorizontalAlignment="Center">
        <ListBox.ItemsPanel>
            <ItemsPanelTemplate>
                <StackPanel></StackPanel>
            </ItemsPanelTemplate>
        </ListBox.ItemsPanel>
        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel>
                    <TextBox Name="ObjectList" Text="{Binding content,Mode=TwoWay,Converter={StaticResource converter1}}"  Margin="0,0,30,0" Height="225" Width="200" HorizontalAlignment="Center"/>
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
    <Button Name="AddButton" Command="{Binding AddCommand}" Grid.Row="1" Grid.Column="1" Height="50" Width="150" HorizontalAlignment="Center" Margin="0,0,10,0">Add</Button>
    <Label Content="ObjectSelect" Height="30" Grid.Column="2"/>
    <!--<ListBox Name="ObjectListSelectedBox1" ItemsSource="{Binding ObjSelected}" Grid.Row="1" Grid.Column="3" Width="200" Height="225" HorizontalAlignment="Center"/>-->
    <ListBox Name="ObjectListsSelected" Grid.Row="1" Grid.Column="2" ItemsSource="{Binding OB2,Mode=TwoWay}" BorderThickness="0" Background="Transparent" Width="200" HorizontalAlignment="Center">
        <ListBox.ItemsPanel>
            <ItemsPanelTemplate>
                <StackPanel></StackPanel>
            </ItemsPanelTemplate>
        </ListBox.ItemsPanel>
        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel>
                    <ListBox Name="ObjectListSelected" ItemsSource="{Binding content,Mode=TwoWay}"  Margin="0,0,30,0" Height="225" Width="200" HorizontalAlignment="Center"/>
                </StackPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </ListBox>
</Grid>

класс ObjectList

class ObjectList
{
    public string header { get; set; }

    private ObservableCollection<string> _content;

    public ObservableCollection<string> content
    {
        get { return _content; }
        set
        {
            _content = value;
        }
    }

    public ObjectList()
    {
        content=new ObservableCollection<string>();
    }

}

Модель основного вида

класс MainVM: INotifyPropertyChanged { public RelayCommand AddCommand {get; задавать; }

    public List<ObjectList> OB2 { get; set; }

    private List<ObjectList> ob1;

    public List<ObjectList> OB1
    {
        get { return ob1; }
        set {
            ob1 = value;
            OnPropertyChanged(nameof(ob1));
            }
    }



    public MainVM()
    {
        this.AddCommand = new RelayCommand(Add);
        OB1 = new List<ObjectList>()
        {
            new ObjectList()
        };
        OB2 = new List<ObjectList>()
        {
            new ObjectList()
        };

    }

    public void Add()
    {
        foreach (var s in OB1[0].content)
        {
            OB2[0].content.Add(s);
        }

        OB1[0].content.Clear();
        OnPropertyChanged(nameof(OB1));

    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(string name)
    {
        PropertyChangedEventHandler handler = PropertyChanged;

        if (handler != null)
        {
            handler(this, new PropertyChangedEventArgs(name));
        }
    }

}

Covertors

public class ListToTextConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        StringBuilder sb = new StringBuilder();
        Type TEST = value.GetType();
        foreach (string s in (ObservableCollection<string>)value) sb.AppendLine(s);
        string str = sb.ToString();
        return str;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        string[] lines = Regex.Split((string)value, "\r\n");
        ObservableCollection<string> OC = new ObservableCollection<string>(lines);
        return (OC);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...