Граница с равномерной BorderThickness не в состоянии связать цвет BorderBrush - PullRequest
0 голосов
/ 11 января 2019

Минимальный, полный, проверяемый пример (.NET Framework 4.0 +):

MainWindowViewModel.cs

namespace MCVBorderTest
{
    public class MainWindowViewModel
    {
        public string BorderColor { get { return "Red"; } }
    }
}

MainWindow.xaml

<Window x:Class="MCVBorderTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Border BorderThickness="1">
        <Border.BorderBrush>
            <SolidColorBrush Color="{Binding BorderColor}" />
        </Border.BorderBrush>
    </Border>
</Window>

MainWindow.xaml.cs

using System.Windows;

namespace MCVBorderTest
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
    }
}

App.xaml

<Application x:Class="MCVBorderTest.App"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:local="clr-namespace:MCVBorderTest">
</Application>

App.xaml.cs

using System.Windows;

namespace MCVBorderTest
{
    /// <summary>
    /// Interaction logic for App.xaml
    /// </summary>
    public partial class App : Application
    {
        protected override void OnStartup(StartupEventArgs e)
        {
            new MainWindow() { DataContext = new MainWindowViewModel() }.Show();
        }
    }
}

App.config

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
    </startup>
</configuration>

Проблема:

Запуск приложения приведет к открытию окна, но граница не имеет цвета. Вывод отладки имеет следующее сообщение:

System.Windows.Data Ошибка: 2: не удается найти управляющий FrameworkElement или FrameworkContentElement для целевого элемента. BindingExpression: Path = BorderColor; DataItem = NULL; целевым элементом является SolidColorBrush (HashCode = 8990007); Целевым свойством является «Цвет» (тип «Цвет»)

Изменение BorderThickness на неоднородное значение, скажем, 0,1,1,1, приведет к тому, что граница получит ожидаемый цвет и не будет ошибки привязки в выходных данных отладки.

Вопрос:

Почему привязка цвета BorderBrush ведет себя таким образом?

1 Ответ

0 голосов
/ 11 января 2019

Для меня это выглядит как настоящая ошибка, обратите внимание на различное поведение кисти границы и фона:

<Border BorderThickness="10">
    <Border.BorderBrush>
        <SolidColorBrush Color="{Binding BorderColor}" />
    </Border.BorderBrush>
    <Border.Background>
        <SolidColorBrush Color="{Binding BorderColor}" />
    </Border.Background>
</Border>

Очевидный обходной путь - дать вашему окну x: Name ("_this") и явно привязать через DataContext:

<SolidColorBrush Color="{Binding ElementName=_this, Path=DataContext.BorderColor}" />

К сожалению, связывание через RelativeSource, похоже, также демонстрирует эту проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...