c# - 读取XML后,更改颜色不会影响属性更改

标签 c# wpf mvvm data-binding inotifypropertychanged

我使用可观察的集合来叠加从INotifyPropertyChange继承的Class

但是,当我更改文本框颜色时,它不会更改属性,并且PropertyChanged保持为空且不会触发。在第一次更改时,它不为null。但第一次更改后,它始终为null。

附上我的代码:

namespace COMSimulator
{

    [XmlRoot("SerialPortsColors")]
    public  class SerialPortsColors: ObservableCollection< COM>
    {

    }

    public class COM : INotifyPropertyChanged
    {

        private string name;
        private string color;

        [XmlAttribute("Name")]
        public string Name
        {
            get
            {
                return name;
            }
            set
            {
                name = value;
                OnProperyChanged(name);
            }
        }

        [XmlAttribute("Color")]

        public string Color
        {
            get
            {
                return color;
            }
            set
            {
                OnProperyChanged(value);
                color = value;

            }
        }

        public COM()
        {
            name = "";
            color = "";
        }

        public event PropertyChangedEventHandler PropertyChanged;

        private void OnProperyChanged(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
    }
}

窗口背后的代码:
public partial class colorPickerWindow : Window
{

    private SerialPortsColorReadWriteXML _SerialPortsColorReadWriteXML;        
    public colorPickerWindow()
    {
        InitializeComponent();            
        updateSerialPorts();
        _SerialPortsColorReadWriteXML = new SerialPortsColorReadWriteXML();            
        string err = _SerialPortsColorReadWriteXML.ReadXML();
        if (err != "")
        {
            MessageBox.Show(err);
            return;
        }
        LBSerialAndColors.ItemsSource = _SerialPortsColorReadWriteXML.LSerialPortsColors;

    }

    private void updateSerialPorts()
    { 

        string [] PortName = System.IO.Ports.SerialPort.GetPortNames();
        for (int i = 0; i <PortName.Length; i++)
        {
            CB_SelecComPort.Items.Add(PortName[i]);
        }

    }

    private void btnAdd_Click(object sender, RoutedEventArgs e)
    {

        string err=""; //case there is an error
        string COM_TEXT = CB_SelecComPort.Text;
        MySerialPort.FuncConverstion.checkComName(ref COM_TEXT,ref err);

        if (_colorPicker.SelectedColor == null)
        {
            MessageBox.Show("Please Select a color");
            return;
        }
        if (err!="")
        {
            MessageBox.Show(err);
            return;
        }

        for (int i = 0; i < _SerialPortsColorReadWriteXML.LSerialPortsColors.Count; i++)
        {
            if (_SerialPortsColorReadWriteXML.LSerialPortsColors[i].Name == CB_SelecComPort.Text)
            {
                _SerialPortsColorReadWriteXML.LSerialPortsColors[i].Color = _colorPicker.SelectedColor.Value.R.ToString("X2") + _colorPicker.SelectedColor.Value.G.ToString("X2") + _colorPicker.SelectedColor.Value.B.ToString("X2") + _colorPicker.SelectedColor.Value.A.ToString("X2"); //R G B A                    
                _SerialPortsColorReadWriteXML.WriteXML();
                _SerialPortsColorReadWriteXML.ReadXML();
                MessageBox.Show("Serial Port and Color has been updated");
                return;
            }

        }

        COM NewCom = new COM ();  
        NewCom.Color = _colorPicker.SelectedColor.Value.R.ToString("X2") + _colorPicker.SelectedColor.Value.G.ToString("X2") + _colorPicker.SelectedColor.Value.B.ToString("X2") + _colorPicker.SelectedColor.Value.A.ToString("X2"); //R G B A                    
        NewCom.Name = CB_SelecComPort.Text;
        _SerialPortsColorReadWriteXML.LSerialPortsColors.Add(NewCom);
        _SerialPortsColorReadWriteXML.WriteXML();
        _SerialPortsColorReadWriteXML.ReadXML();
        MessageBox.Show("Serial Port and Color has been updated");
    }
}



public class COMColorConverter: IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        string Color_bytes = value.ToString();
        string R = Color_bytes[0].ToString() + Color_bytes[1].ToString();
        string G = Color_bytes[2].ToString() + Color_bytes[3].ToString();
        string B = Color_bytes[4].ToString() + Color_bytes[5].ToString();
        string A = Color_bytes[6].ToString() + Color_bytes[7].ToString();

        Color _Color = new Color();
        _Color.R = byte.Parse(R,System.Globalization.NumberStyles.AllowHexSpecifier);
        _Color.G = byte.Parse(G, System.Globalization.NumberStyles.AllowHexSpecifier);
        _Color.B = byte.Parse(B, System.Globalization.NumberStyles.AllowHexSpecifier);
        _Color.A = byte.Parse(A, System.Globalization.NumberStyles.AllowHexSpecifier);

        SolidColorBrush SCB = new SolidColorBrush(_Color);
        return SCB;



    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}


public class SerialPortsColorReadWriteXML:
{

    private SerialPortsColors _LSerialPortsColors;


    public SerialPortsColorReadWriteXML()
    {

        _LSerialPortsColors = new SerialPortsColors();
    }

    public SerialPortsColors LSerialPortsColors
    {
        get
        {
            return _LSerialPortsColors;
        }

        set
        {
            _LSerialPortsColors = value;

        }

    }
    private  string path = "SerialPortsColors.xml";        



    /// <summary>
    /// read the serial ports color XML
    /// </summary>
    /// <returns>In Case of an error return the error</returns>
    public  string ReadXML()
    {            
        XmlSerializer serializer = new XmlSerializer(typeof(SerialPortsColors));
        try
        {
            using (XmlReader reader = XmlReader.Create(path))
            {
                LSerialPortsColors = (SerialPortsColors)serializer.Deserialize(reader);                    
            }
            return "";
        }

        catch  (Exception )
        {
            return "There is an issue with the path of the Serial Ports Color XML";

        }


    }


    public  string WriteXML()
    {
        XmlSerializer serializer = new XmlSerializer(typeof(SerialPortsColors));
        try
        {
            XmlWriterSettings xws = new XmlWriterSettings();
            xws.Indent = true;
            using (XmlWriter writer = XmlWriter.Create(path, xws))
            {



                serializer.Serialize(writer, LSerialPortsColors);
            }

            return "";
        }

        catch
        {
            return  "There is an issue Creating a new XML File";

        }            

    }





}

XAML:
<Window x:Class="COMSimulator.colorPickerWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"        
    xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit"  
    xmlns:Converters="clr-namespace:COMSimulator"

    Title="colorPickerWindow" Height="400" Width="300" WindowState="Normal" WindowStartupLocation="CenterScreen" ResizeMode="NoResize">

<Window.Resources>
    <Converters:COMColorConverter x:Key="COMColorConverter" />
</Window.Resources>

<Grid>

    <Grid.Resources>
        <DataTemplate x:Key="COMColorTemplate">
            <Border BorderBrush="Black" BorderThickness="1">
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="1*"></ColumnDefinition>
                        <ColumnDefinition Width="1*"></ColumnDefinition>
                    </Grid.ColumnDefinitions>
                    <TextBox Grid.Column="0" Text="{Binding Path=Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged }" HorizontalAlignment="Left"  VerticalAlignment="Center" Width="100" />
                    <TextBlock Grid.Column="1" HorizontalAlignment="Left" Width="150"  Background="{Binding UpdateSourceTrigger=PropertyChanged, Mode=TwoWay, Path=Color, Converter={StaticResource COMColorConverter}}" ></TextBlock>                                            
            </Grid>
            </Border>
        </DataTemplate>
    </Grid.Resources>
    <Grid.RowDefinitions>
        <RowDefinition Height="120"/>
        <RowDefinition Height="3"/>
        <RowDefinition Height="1*"/>
    </Grid.RowDefinitions>
    <Border Grid.Row="0" Grid.Column="0" BorderThickness="1" BorderBrush="Black">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="1*"></RowDefinition>
            <RowDefinition Height="10"></RowDefinition>
            <RowDefinition Height="1*"></RowDefinition>
            <RowDefinition Height="10"></RowDefinition>
            <RowDefinition Height="1*"></RowDefinition>
        </Grid.RowDefinitions>

        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="1*"></ColumnDefinition>
            <ColumnDefinition Width="1*"></ColumnDefinition>
            <ColumnDefinition Width="5"></ColumnDefinition>

            </Grid.ColumnDefinitions>

        <Label Content="Select COM Port:" VerticalAlignment="Center" HorizontalAlignment="Center"></Label>
        <ComboBox x:Name="CB_SelecComPort" Grid.Column="1" Grid.Row="0" VerticalAlignment="Center"></ComboBox>
        <Label Content="Select Color:" VerticalAlignment="Center" Grid.Row="2" Grid.Column="0" HorizontalAlignment="Center"></Label>
        <xctk:ColorPicker x:Name="_colorPicker" Grid.Column="1" Grid.Row="2" VerticalAlignment="Center" />
        <Button x:Name="btnAdd" Content="Add Or Edit" Grid.Row="4" Grid.Column="0" Grid.ColumnSpan="2" HorizontalAlignment="Center" VerticalAlignment="Center" Width="150" Click="btnAdd_Click"></Button>
    </Grid>
    </Border>

    <Border Grid.Row="2" Grid.Column="0" BorderThickness="1" BorderBrush="Black" >
        <ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
            <ListBox x:Name="LBSerialAndColors" ItemTemplate="{DynamicResource COMColorTemplate}" >

            </ListBox>
        </ScrollViewer>
    </Border>
</Grid>
</Window>

最佳答案

您要在更改颜色之前通知UI您的颜色已更改。试试这个:

public string Color
{
    get
    {
        return color;
    }
    set
    {

        color = value;
        OnProperyChanged("Color");

    }
}

关于c# - 读取XML后,更改颜色不会影响属性更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43392499/

相关文章:

c# - Lambda 表达式到 Func<T, TResult>

c# - IdentityServer 4,试图用 fiddler 捕获流量?

c# - 如何在 blazor wasm 项目上启用 blazor United?

c# - 如何使用自动增量列 SQLite 插入行

c# - 从模型创建 ViewModel

c# - 使用 .Net 如何使用 Sort 方法对数组进行反向排序,即从 Z 到 A?

.net - WPF 控件和 SystemColors - Alpha 混合?

c# - 初始化构造函数/对象的可能方法

wpf - WPF 中不存在另一个名称的问题

c# - WPF MVVM 和具有依赖属性的嵌套 View