У меня есть ListView в WPF с текстом и цветными прямоугольниками. Дополнительно есть текстовое поле и прямоугольник с привязкой к ListView. Выбранный элемент списка отображается в текстовом поле и прямоугольнике:

<ListView x:Name="StatusOEMList" HorizontalAlignment="Left" Height="195" Margin="50,50,0,0" VerticalAlignment="Top" Width="255" ItemsSource="{Binding OEM}" IsSynchronizedWithCurrentItem="True">
    <ListView.View>
        <GridView>
            <GridViewColumn Header="Status" DisplayMemberBinding="{Binding value}" />
            <GridViewColumn Header="Farbe">
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <Rectangle Width="10" Height="10" Fill="{Binding color, Converter={StaticResource ColorToBrushConverter}}"/>
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>
        </GridView>
    </ListView.View>
</ListView>
<TextBox HorizontalAlignment="Left" Height="23" Margin="50,272,0,0" TextWrapping="Wrap" Text="{Binding ElementName=StatusOEMList, Path=SelectedItem.value}"  VerticalAlignment="Top" Width="120"/>
<Rectangle Fill="{Binding ElementName=StatusOEMList, Path=SelectedItem.color, Converter={StaticResource ColorToBrushConverter}}" HorizontalAlignment="Left" Height="23" Margin="192,272,0,0" Stroke="Black" VerticalAlignment="Top" Width="23" MouseLeftButtonDown="rectangle_MouseLeftButtonDown" Cursor="Pen"/>

Когда я изменяю текст, изменение передается обратно в ListView. Хороший. Но как я могу изменить цвет прямоугольника и передать изменение обратно в ListView? Я реализовал ColorPicker, чтобы изменить цвет прямоугольника:

void rectangle_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    ColorDialog colorDialog = new ColorDialog();
    colorDialog.SelectedColor = ((SolidColorBrush)((Rectangle)sender).Fill).Color;
    colorDialog.Owner = this;
    if ((bool)colorDialog.ShowDialog())
    {
        ((Rectangle)sender).Fill = new SolidColorBrush(colorDialog.SelectedColor);
    }
}

Думаю, я перезаписываю привязку в прямоугольнике. Заполните там. Как я могу просто изменить цвет и сохранить переплет?

0
otto.kranz 23 Окт 2019 в 12:54

1 ответ

Лучший ответ

Вы действительно перезаписываете привязку Rectangle.Fill локальным значением. Попробуйте вместо этого изменить связанное свойство:

void rectangle_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    ColorDialog colorDialog = new ColorDialog();
    colorDialog.SelectedColor = ((SolidColorBrush)((Rectangle)sender).Fill).Color;
    colorDialog.Owner = this;
    if ((bool)colorDialog.ShowDialog())
    {
        var vm = StatusOEMList.SelectedItem as MyViewModel;
        vm.color = colorDialog.SelectedColor;
    }
}
1
ASh 23 Окт 2019 в 09:59