mirror of
https://github.com/microsoft/PowerToys.git
synced 2025-12-16 19:57:57 +01:00
<!-- Enter a brief description/summary of your PR here. What does it fix/what does it change/how was it tested (even manually, if necessary)? --> ## Summary of the Pull Request Fixed build warnings WMC1510 in `HostsMainPage.xaml` that were preventing proper AOT (Ahead-of-Time) compilation compatibility for XAML data bindings. ### Problem The Hosts module was generating multiple WMC1510 warnings during build: ``` src\modules\Hosts\HostsUILib\HostsMainPage.xaml(614,13): Warning WMC1510: Ensure the property path is trimming and AOT compatible by making use of 'Compiled Bindings (x:bind)' if possible or by specifying the 'x:DataType' directive... ``` These warnings occurred on 6 different binding expressions in the EntryDialog ContentDialog that bound to properties of the `Entry` model class. ### Solution Applied the recommended fix by adding proper type information for the XAML compiler: 1. **Added `x:DataType="models:Entry"`** to the ContentDialog element to specify the binding context type 2. **Added `[Bindable]` attribute** to the Entry model class to ensure WinRT compatibility ### Changes Made - **HostsMainPage.xaml**: Added `x:DataType="models:Entry"` attribute to the EntryDialog ContentDialog - **Entry.cs**: Added `[Bindable]` attribute and `using Microsoft.UI.Xaml.Data;` directive <!-- Provide a more detailed description of the PR, other things fixed, or any additional comments/features here --> ## Detailed Description of the Pull Request / Additional comments - ✅ Resolves all 6 WMC1510 warnings in the specified lines - ✅ Ensures AOT compilation compatibility - ✅ No functional changes to UI behavior - ✅ Minimal code changes (3 lines total) - ✅ Follows Microsoft's recommended approach for WinRT data binding The fix enables proper trimming and AOT compilation while maintaining all existing functionality. <!-- Describe how you validated the behavior. Add automated tests wherever possible, but list manual validation steps taken as well --> ## Validation Steps Performed Try to build and run locally without problem.
193 lines
5.2 KiB
C#
193 lines
5.2 KiB
C#
// Copyright (c) Microsoft Corporation
|
|
// The Microsoft Corporation licenses this file to you under the MIT license.
|
|
// See the LICENSE file in the project root for more information.
|
|
|
|
using System;
|
|
using System.Net;
|
|
using System.Text;
|
|
|
|
using CommunityToolkit.Mvvm.ComponentModel;
|
|
using HostsUILib.Helpers;
|
|
|
|
namespace HostsUILib.Models
|
|
{
|
|
#if !TESTONLY
|
|
[Microsoft.UI.Xaml.Data.Bindable]
|
|
#endif
|
|
public partial class Entry : ObservableObject
|
|
{
|
|
private static readonly char[] _spaceCharacters = new char[] { ' ', '\t' };
|
|
|
|
[ObservableProperty]
|
|
[NotifyPropertyChangedFor(nameof(Valid))]
|
|
[NotifyPropertyChangedFor(nameof(IsAddressValid))]
|
|
private string _address;
|
|
|
|
partial void OnAddressChanged(string value)
|
|
{
|
|
if (ValidationHelper.ValidIPv4(value))
|
|
{
|
|
Type = AddressType.IPv4;
|
|
}
|
|
else if (ValidationHelper.ValidIPv6(value))
|
|
{
|
|
Type = AddressType.IPv6;
|
|
}
|
|
else
|
|
{
|
|
Type = AddressType.Invalid;
|
|
}
|
|
}
|
|
|
|
[ObservableProperty]
|
|
[NotifyPropertyChangedFor(nameof(Valid))]
|
|
[NotifyPropertyChangedFor(nameof(IsHostsValid))]
|
|
private string _hosts;
|
|
|
|
partial void OnHostsChanged(string value)
|
|
{
|
|
SplittedHosts = value.Split(' ');
|
|
}
|
|
|
|
[ObservableProperty]
|
|
[NotifyPropertyChangedFor(nameof(Valid))]
|
|
private string _comment;
|
|
|
|
[ObservableProperty]
|
|
private bool _active;
|
|
|
|
[ObservableProperty]
|
|
private bool? _ping;
|
|
|
|
[ObservableProperty]
|
|
private bool _pinging;
|
|
|
|
[ObservableProperty]
|
|
private bool _duplicate;
|
|
|
|
public bool Valid => Validate(true);
|
|
|
|
public bool IsAddressValid => ValidateAddressField();
|
|
|
|
public bool IsHostsValid => ValidateHostsField(true);
|
|
|
|
public string Line { get; private set; }
|
|
|
|
public AddressType Type { get; private set; }
|
|
|
|
public string[] SplittedHosts { get; private set; }
|
|
|
|
public int Id { get; set; }
|
|
|
|
public Entry()
|
|
{
|
|
}
|
|
|
|
public Entry(int id, string line)
|
|
{
|
|
Id = id;
|
|
Line = line.Trim();
|
|
Parse();
|
|
}
|
|
|
|
public Entry(int id, string address, string hosts, string comment, bool active)
|
|
{
|
|
Id = id;
|
|
Address = address.Trim();
|
|
Hosts = hosts.Trim();
|
|
Comment = comment.Trim();
|
|
Active = active;
|
|
}
|
|
|
|
public void Parse()
|
|
{
|
|
Active = !Line.StartsWith("#", StringComparison.InvariantCultureIgnoreCase);
|
|
|
|
var lineSplit = Line.TrimStart(' ', '#').Split('#');
|
|
|
|
if (lineSplit.Length == 0)
|
|
{
|
|
return;
|
|
}
|
|
|
|
var addressHost = lineSplit[0];
|
|
|
|
var addressHostSplit = addressHost.Split(_spaceCharacters, StringSplitOptions.RemoveEmptyEntries);
|
|
var hostsBuilder = new StringBuilder();
|
|
var commentBuilder = new StringBuilder();
|
|
|
|
for (var i = 0; i < addressHostSplit.Length; i++)
|
|
{
|
|
var element = addressHostSplit[i].Trim();
|
|
|
|
if (i == 0 && IPAddress.TryParse(element, out var _) && (element.Contains(':') || element.Contains('.')))
|
|
{
|
|
Address = element;
|
|
}
|
|
else
|
|
{
|
|
if (hostsBuilder.Length > 0)
|
|
{
|
|
hostsBuilder.Append(' ');
|
|
}
|
|
|
|
hostsBuilder.Append(element);
|
|
}
|
|
}
|
|
|
|
Hosts = hostsBuilder.ToString();
|
|
|
|
for (var i = 1; i < lineSplit.Length; i++)
|
|
{
|
|
if (commentBuilder.Length > 0)
|
|
{
|
|
commentBuilder.Append('#');
|
|
}
|
|
|
|
commentBuilder.Append(lineSplit[i]);
|
|
}
|
|
|
|
Comment = commentBuilder.ToString().Trim();
|
|
}
|
|
|
|
public Entry Clone()
|
|
{
|
|
return new Entry
|
|
{
|
|
Line = Line,
|
|
Address = Address,
|
|
Hosts = Hosts,
|
|
Comment = Comment,
|
|
Active = Active,
|
|
};
|
|
}
|
|
|
|
private bool ValidateAddressField()
|
|
{
|
|
return Type != AddressType.Invalid;
|
|
}
|
|
|
|
private bool ValidateHostsField(bool validateHostsLength)
|
|
{
|
|
return ValidationHelper.ValidHosts(Hosts, validateHostsLength);
|
|
}
|
|
|
|
public bool Validate(bool validateHostsLength)
|
|
{
|
|
if (Equals("102.54.94.97", "rhino.acme.com", "source server") || Equals("38.25.63.10", "x.acme.com", "x client host"))
|
|
{
|
|
return false;
|
|
}
|
|
|
|
return ValidateAddressField() && ValidateHostsField(validateHostsLength);
|
|
}
|
|
|
|
private bool Equals(string address, string hosts, string comment)
|
|
{
|
|
return string.Equals(Address, address, StringComparison.Ordinal)
|
|
&& string.Equals(Hosts, hosts, StringComparison.Ordinal)
|
|
&& string.Equals(Comment, comment, StringComparison.Ordinal);
|
|
}
|
|
}
|
|
}
|