根据 属性 值更改样式

Change style based on property value

在主要 window 的 Canvas 上,我正在绘制一些传感器。

我创建了 class“传感器”

public class Sensor
{
    public int Id_Sens { get; set; }    
    public int Type { get; set; }
    public UIElement Ui_Element { get; set; }
}

我以编程方式创建了一个包含两列的 Grid(一个 Rectangle 具有相同的 WIDTH 和 HEIGHT(-> 成为一个正方形),具有以下样式,在第一个和 Label 在第二个)。我将此 GridUi_Element 相关联(Ui_Element = gridMain)。

这很好用。

根据属性Type的值,我想改变Rectangle的半径(并画一个圆)

我创建了关注XAML

<Style x:Key="Sens_Shape" TargetType="{x:Type Rectangle}">
    <Setter Property="Stroke" Value="Black"/>
    <Setter Property="StrokeThickness" Value="1"/>
    <Style.Triggers>
        <DataTrigger Binding="{Binding Path=Type}" Value="0">
            <Setter Property="RadiusX" Value="60"/>
            <Setter Property="RadiusY" Value="60"/>
        </DataTrigger>
    </Style.Triggers>
</Style>

如何将 class Sensor 的 属性 Type 绑定到触发器?

编辑 我用 EldHasp

的第 1 点和第 3 点解决了

我可能不会给出准确的答案,因为原问题中没有足够的细节。

  1. 您在Window中显示的元素被记录在属性中 public UIElement Ui_Element?
    如果是这样,则将 属性 类型更改为 public FrameworkElement Ui_Element,因为 Style 和 DataContext 属性是在 FrameworkElement 上定义的,而不是 UIElement.

  2. 如果是更窄的类型(例如,在你的例子中总是Shape),那么指定这个更窄的类型就更好了。

  3. 如果你显示的样式是Ui_Element属性中元素的样式,那么将Sensor传入该元素的Data Context即可.
    示例:sensor.Ui_Element.DataContext = sensor;.

  4. 您在 Sharpe 上创建 UI 元素非常徒劳。 WPF的核心语言是XAML。在非常罕见、相当困难的情况下,值得使用 Sharp。 在大多数情况下,XAML 解决方案将比夏普更简单、更典型、更易于理解。
    在您的情况下,您应该创建一个没有 Ui_Element 属性 的传感器集合。 为传感器创建一个模板选择器,通过类型 属性,它将设置其视觉外观。 在 XAML 中,为此集合设置 ItemsControl 并为其提供模板选择器。
    此外还有其他几个典型的 WPF 实现。