C# 从wpf样式到viewmodel的数据绑定属性
我有一个使用两个独立项目的应用程序。一个用于包含我的ViewModels的主可执行文件,另一个用于控制应用程序的主题/样式 在主题项目中,我自定义了DataGridColumnHeader的样式,以包含一个复选框。现在如何将复选框数据绑定到ViewModel 我的主题xamlC# 从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}'>
<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);
}
}
}