WPF - MVVM绑定时不设置路径样式

本文关键字:设置 路径 样式 定时 MVVM 绑定 WPF | 更新日期: 2023-09-27 18:16:53

我的标签项声明如下:

  <TabItem >
                <TabItem.HeaderTemplate>
                    <DataTemplate DataType="pricefiles:ConfigureViewModel">
                        <StackPanel Orientation="Horizontal">
                            <Path Style="{Binding StandardEnabled}"/>
                            <TextBlock Text="Standard" Margin="5" />
                        </StackPanel>
                    </DataTemplate>
                </TabItem.HeaderTemplate>
                <Grid Background="#FFE5E5E5">
                    <Standard:StandardView />
                </Grid>
            </TabItem>

然后在视图模型中,我有:

    private Style _standardEnabled;
    public Style StandardEnabled
    {
        get { return _standardEnabled; }
        set { SetProperty(ref _standardEnabled, value); }
    }
 public ConfigureViewModel(SYSTEM_Account account)
    {
        try
        {
            Account = account;
            StandardEnabled = (Style) Application.Current.FindResource("HeadersIcon");
        }
        catch (Exception ex)
        {

        }
    }

样式在资源字典中声明为:

    <Style x:Key="HeadersIcon" TargetType="Path">
    <Setter Property="Data" Value="M0,13.333001L35.555001,13.333001 35.555001,33.778223C35.555001,35.250969,34.36089,36.445002,32.88818,36.445002L2.666523,36.445002C1.1938604,36.445002,2.4359167E-07,35.250969,0,33.778223z M3.2485678,6.19415L3.2485678,8.0274701 22.415489,8.0274701 22.415489,6.19415z M3.2485678,2.6108398L3.2485678,4.44415 22.415489,4.44415 22.415489,2.6108398z M2.666523,0L32.88818,0C34.36089,0,35.555001,1.19415,35.555001,2.6666899L35.555001,10.222 0,10.222 0,2.6666899C2.4359167E-07,1.19415,1.1938603,0,2.666523,0z" />
    <Setter Property="RenderTransformOrigin" Value="0.5,0.5"></Setter>
    <Setter Property="Stretch" Value="Uniform"></Setter>
    <Setter Property="Fill" Value="#FF000000"></Setter>
    <Setter Property="Width" Value="16"></Setter>
    <Setter Property="Height" Value="16"></Setter>
</Style>

当这段代码触发时,我可以在StandardEnabled属性中看到资源(样式),但是它不会绑定到Path。

我想要根据不同的情况将数据绑定到不同的资源。

编辑:

当用户按下父窗口上的按钮时,视图/视图模型被初始化:

try
{
    var tmpVm = new ConfigureViewModel(SystemAccount);
    var tmp = new ConfigureView(tmpVm);
    tmp.ShowDialog();
}
catch (Exception ex)
{
}

初始化数据上下文:

public ConfigureView(ConfigureViewModel configureViewModel)
{
    InitializeComponent();
    DataContext = configureViewModel;
}

WPF - MVVM绑定时不设置路径样式

我重现了你的问题。问题是,您正在定义一个以ConfigureViewModel为目标的HeaderTemplate,但没有显式地将Header的内容设置为该类型的对象。

由于您设置DataContext的方式,实际上不需要定义模板。您可以正常地定义控件,并且绑定将按预期工作。您可以用以下XAML

替换TabItem.HeaderTemplate
<TabItem.Header>
    <StackPanel Orientation="Horizontal">
      <Path Style="{Binding StandardEnabled}"/>
      <TextBlock Text="Standard" Margin="5" />
    </StackPanel>
</TabItem.Header>

如果你想保留头模板,你可以公开一个类型为ConfigureViewModel的属性,然后将制表项的头绑定到它。这可能需要一些小的重构,但这可能是您想要的。示例如下:

<TabItem.HeaderTemplate>
    <DataTemplate DataType="pricefiles:ConfigureViewModel">
         <StackPanel Orientation="Horizontal">
               <Path Style="{Binding StandardEnabled}"/>
               <TextBlock Text="Standard" Margin="5" />
          </StackPanel>
     </DataTemplate>
</TabItem.HeaderTemplate>
<TabItem.Header = "{Binding MyConfigureViewModel}" />

对于第一种解决方案,您显式地定义标题应该是什么样子,并将其属性直接绑定到DataContext。对于第二个解决方案,您说我想将标题的内容直接绑定到DataContext上的内容。然后使用模板来定义该对象应该如何显示。