WPF数据绑定到接口找不到属性

时间:2016-04-12 16:15:43

标签: c# wpf xaml datagrid

我正在使用here提供的解决方案,这对我来说效果一直很好。我现在尝试通过以下XAML执行datatrigger绑定到接口属性:

<DataGrid.RowStyle>
    <Style TargetType="{x:Type DataGridRow}">
    <Style.Triggers>
        <DataTrigger Binding="{Binding Path=(selection:IChartDefinitionViewModel.SelectedItem).HasErrors}" Value="False">
        <Setter Property="Background" Value="Transparent"/>
        </DataTrigger>
        <DataTrigger Binding="{Binding Path=(selection:IChartDefinitionViewModel.SelectedItem).HasErrors}" Value="True">
        <Setter Property="Background" Value="Red"/>
        </DataTrigger>
    </Style.Triggers>
    </Style>
</DataGrid.RowStyle>

当我输入此代码时,我会收到警告&#34;会员&#39; SelectedItem&#39;无法识别或无法访问&#34;,当我尝试运行时,我收到类似的异常。唯一的问题是,在接口上定义的成员SelectedItem,我甚至可以从XAML导航到它:

public interface IChartDefinitionViewModel : IReactiveSelector<SomeClass>, IMayHaveErrors
{
     // stuff
}

public interface IReactiveSelector<T> : // more stuff  
{
    T SelectedItem { get; set; }
}

任何人都可以建议为什么会发生这种情况以及我可以为解决方法做些什么?如果可能的话,我想根据接口定义或使用datatemplate来管理我的IChartDefinitionViewModel实现。

更新 这也行不通,但出于不同的原因 - 当我尝试直接绑定到对象时,尽管HasErrors从true切换为false,但背景并没有改变。

<DataGrid.RowStyle>
    <Style TargetType="{x:Type DataGridRow}">
    <Style.Triggers>
        <DataTrigger Binding="{Binding SelectedItem.HasErrors}" Value="True">
        <Setter Property="Background" Value="Transparent"/>
        </DataTrigger>
        <DataTrigger Binding="{Binding SelectedItem.HasErrors}" Value="False">
        <Setter Property="Background" Value="Red"/>
        </DataTrigger>
    </Style.Triggers>
    </Style>
</DataGrid.RowStyle>

1 个答案:

答案 0 :(得分:1)

我原来的帖子似乎有两个问题。首先是有一个datacontext问题 - 感谢James Durda指出这一点。行上下文的类型为ChartDefinitionViewModel,因此此代码按预期工作:

<DataGrid.RowStyle>
    <Style TargetType="{x:Type DataGridRow}">
    <Style.Triggers>
        <DataTrigger Binding="{Binding Path=(selection:ChartDefinitionViewModel.HasErrors)}" Value="False">
        <Setter Property="Background" Value="Transparent"/>
        </DataTrigger>
        <DataTrigger Binding="{Binding Path=(selection:ChartDefinitionViewModel.HasErrors)}" Value="True">
        <Setter Property="Background" Value="Red"/>
        </DataTrigger>
    </Style.Triggers>
    </Style>
</DataGrid.RowStyle>

然而,有趣的是,绑定到IChartDefinitionViewModel接口上的HasErrors属性会导致抛出异常,指出属性路径无效,这让我再次回到原来的查询:

<DataGrid.RowStyle>
    <Style TargetType="{x:Type DataGridRow}">
    <Style.Triggers>
        <DataTrigger Binding="{Binding Path=(selection:IChartDefinitionViewModel.HasErrors)}" Value="False">
        <Setter Property="Background" Value="Transparent"/>
        </DataTrigger>
        <DataTrigger Binding="{Binding Path=(selection:IChartDefinitionViewModel.HasErrors)}" Value="True">
        <Setter Property="Background" Value="Red"/>
        </DataTrigger>
    </Style.Triggers>
    </Style>
</DataGrid.RowStyle>
但是,当我绑定到直接定义HasErrors属性的接口时,事情开始按预期工作。

<DataGrid.RowStyle>
    <Style TargetType="{x:Type DataGridRow}">
    <Style.Triggers>
        <DataTrigger Binding="{Binding Path=(interfaces:IMayHaveErrors.HasErrors)}" Value="False">
        <Setter Property="Background" Value="Transparent"/>
        </DataTrigger>
        <DataTrigger Binding="{Binding Path=(interfaces:IMayHaveErrors.HasErrors)}" Value="True">
        <Setter Property="Background" Value="Red"/>
        </DataTrigger>
    </Style.Triggers>
    </Style>
</DataGrid.RowStyle>  

我不确定这是否是一个孤立的情况,但似乎WPF绑定无法定位接口继承层次结构中向上定义的属性,至少在这种情况下。

相关问题