2016-04-12 3 views
0

Я работаю с представленным решением here, который работал хорошо для меня до этого момента. Я сейчас пытаюсь выполнить DataTrigger привязки к собственности интерфейса с помощью следующей XAML:WPF привязка данных к интерфейсу не может найти свойство

<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> 

Когда я ввожу этот код я получаю предупреждение «The член„SelectedItem“не распознается или не доступен», и Я получаю подобное исключение, когда пытаюсь запустить. Единственное, там является SelectedItem члена определяется на интерфейсе, и я могу даже перейти к ней из XAML:

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

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

Может кто-нибудь посоветовать, почему это происходит и что я могу сделать для решения проблемы? Я хотел бы управлять этим на основе определения интерфейса или использовать datatemplate для моей реализации IChartDefinitionViewModel, если это возможно.

Update: Это также не работает, но по другой причине - при попытке привязать к объекту непосредственно, фон не меняется, несмотря на то, что HasErrors переключает от истинного на ложное.

<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

Понял - к сожалению, привязка по-прежнему не работает, когда я привязываюсь к объекту напрямую (см. Обновление). – ket

+1

Ваше редактирование работает для меня, пока все части на месте, однако, возможно ли, что ваши 'DataContext' смешаны. У каждой строки действительно есть свойство «SelectedItem»? –

ответ

1

Кажется, что были два вопроса с моим оригинальным сообщением. Во-первых, это проблема с дат-сайтом - благодаря Джеймсу Дурде, указав это. Контекстная строка типа 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> 

Интересно, однако, привязка к свойству HasErrors по результатам интерфейса IChartDefinitionViewModel в брошенном исключении, заявив, что путь свойства недопустим, который приносит меня снова к моему первоначальному запросу:

<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 привязка не может найти свойство, определенное выше в иерархии наследования интерфейса, по крайней мере, в данном случае.

Смежные вопросы