C# 从wpf样式到viewmodel的数据绑定属性

C# 从wpf样式到viewmodel的数据绑定属性,c#,wpf,xaml,mvvm,data-binding,C#,Wpf,Xaml,Mvvm,Data Binding,我有一个使用两个独立项目的应用程序。一个用于包含我的ViewModels的主可执行文件,另一个用于控制应用程序的主题/样式 在主题项目中,我自定义了DataGridColumnHeader的样式,以包含一个复选框。现在如何将复选框数据绑定到ViewModel 我的主题xaml <Style x:Key='PlottableFilteringColumnHeaderStyle' TargetType='{x:Type primitives:DataGridColumnHeader}'>

我有一个使用两个独立项目的应用程序。一个用于包含我的ViewModels的主可执行文件,另一个用于控制应用程序的主题/样式

在主题项目中,我自定义了DataGridColumnHeader的样式,以包含一个复选框。现在如何将复选框数据绑定到ViewModel

我的主题xaml

<Style x:Key='PlottableFilteringColumnHeaderStyle' TargetType='{x:Type primitives:DataGridColumnHeader}'>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type primitives:DataGridColumnHeader}">
                <Grid>
                    <themes:DataGridHeaderBorder x:Name='HeaderBorder'>
                        <Grid x:Name="GridColumnHeader">
                            <StackPanel x:Name="argStackPanel">
                                <CheckBox x:Name="argCheckBox" Content="Enable Arg" Style="{DynamicResource ResourceKey=DefaultCheckBox}" />
                            </StackPanel>
                        </Grid> 
                    </themes:DataGridHeaderBorder>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

我一直收到“BindingExpression路径错误:在“对象”错误上找不到属性”。关于如何修复此问题或是否有更好的方法解决此问题,您有什么想法吗?

这将是一个问题,因为您实际上需要为要绑定的
已选中的
属性创建一个新的依赖项属性,并且尽管您正在创建模板,但您正在将其设置为样式,在这一点上,您将丢失任何不是您试图绑定的类型固有的属性。基本上,您有两个选项:1)创建包含msising DP的自定义DataGridColumnHeader,或2)为您的列创建视图模型。实际上,第三个解决方案将涉及添加附加行为,该行为使用附加属性进行绑定,但这实际上只是将代码从代码后面移动到行为中。我自己可能也会采用动态列绑定的方法。1)创建一个自定义DataGridColumnHeader,其中包含缺少的DPM标记。感谢您的解释。我的datagrid行已经绑定到视图模型。我将尝试您的第一个建议。您能提供一个示例,说明如何将新创建的依赖项属性连接到我的主可执行项目吗?
public class HeaderArgConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        string headerText = values[0] as string;

        if (!String.IsNullOrWhiteSpace(headerText))
        {
            FrameworkElement targetElement = values[1] as FrameworkElement;
            DataGridColumnHeader header = targetElement.TemplatedParent as DataGridColumnHeader;
            string columnName = header.DataContext != null ? header.DataContext.ToString() : "";
            var argNumber = System.Text.RegularExpressions.Regex.Match(columnName.Split(':')[0], @"\d+$").Value; // use the header text to determine which arg number

            Binding binding = new Binding("SelectedViewModel.EnableArg" + argNumber);
            binding.Source = Window.DataContextProperty;  // This is what I am unsure about
            (targetElement as CheckBox).SetBinding(CheckBox.IsCheckedProperty, binding);
        }
    }
}