2012-01-24 29 views
3

我有以下的DataGrid代碼如何使互斥複選框在WPF DataGrid列

<UserControl x:Class="abc.WPFApp.UCGrid" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:WPFtoolkit="http://schemas.microsoft.com/wpf/2008/toolkit" 
    xmlns:local="clr-namespace:abc.WPFApp"> 

    <UserControl.Resources> 
<!--Restrict editing based on IsVariable--> 
     <Style x:Key="CheckBoxCellStyle" TargetType="{x:Type CheckBox}"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding Path=IsVariable}" Value="true"> 
        <Setter Property="IsEnabled" Value="false"/> 
       </DataTrigger> 
      </Style.Triggers> 
      <Setter Property="HorizontalAlignment" Value="Center"/> 
     </Style> 
</UserControl.Resources> 
<Grid> 
     <WPFtoolkit:DataGrid x:Name="UCdataGridView" ItemsSource="{Binding}" 
                CellStyle="{StaticResource defaultCellStyle}" 
                RowStyle="{StaticResource defaultRowStyle}" 
                ColumnHeaderStyle="{StaticResource defaultDataGridColumnHeader}" 
                SelectionUnit="FullRow" 
                IsSynchronizedWithCurrentItem="True" 
                RowBackground="White" 
                AlternatingRowBackground="AliceBlue" 
            AutoGenerateColumns="False" SelectionMode="Extended" RowHeaderWidth="20" 
            CanUserAddRows="True" CanUserDeleteRows="True" CanUserReorderColumns="False" 
            CanUserResizeColumns="True" AllowDrop="True" KeyUp="UCGridKeyUp" > 
      <WPFtoolkit:DataGrid.Columns> 


<WPFtoolkit:DataGridCheckBoxColumn x:Name="dgChkRepeatingData" Binding="{Binding Path=MasterDataFlag}" MaxWidth="135" MinWidth="80" 
            Header="Repeating data" Visibility="Collapsed" IsReadOnly="{Binding (IsVariable)}" 
            EditingElementStyle="{StaticResource CheckBoxCellStyle}" 
             > 
       </WPFtoolkit:DataGridCheckBoxColumn> 

       <WPFtoolkit:DataGridCheckBoxColumn MaxWidth="100" Header="Max Element" x:Name="dgChkMaxElement" 
                Binding="{Binding Path=MaxElement}" MinWidth="70" Visibility="Collapsed" 
            EditingElementStyle="{StaticResource CheckBoxCellStyle}"> 
       </WPFtoolkit:DataGridCheckBoxColumn> 

       <WPFtoolkit:DataGridCheckBoxColumn MaxWidth="100" Header="In For Loop" x:Name="dgChkInForLoop" 
                Binding="{Binding Path=InForLoop}" MinWidth="70" Visibility="Collapsed" 
            EditingElementStyle="{StaticResource CheckBoxCellStyle}"> 
       </WPFtoolkit:DataGridCheckBoxColumn> 

       <WPFtoolkit:DataGridTextColumn x:Name="dgXPath" Binding="{Binding Path=XPath}" Header="XPath" Width="500" 
               Visibility="Collapsed" IsReadOnly="{Binding Path=IsVariable}" 
               EditingElementStyle="{StaticResource TextBoxCellStyle}"/> 
</WPFtoolkit:DataGrid.Columns> 
     </WPFtoolkit:DataGrid> 

這個用戶控件網如果由三列這應該是相互排斥的。 我想通過在XAML中創建觸發器來實現這一點,我們如何做到這一點?

+0

您遇到的問題是顯式設置一個值將覆蓋任何觸發器值。當你在做數據綁定時,你有什麼理由不能在後端模型對象中實現排他性 –

+0

你爲什麼要這樣做?它是應用程序邏輯的一部分,屬於ViewModel,而不屬於視圖。你真的不應該在XAML中使用觸發器來實現應用邏輯/約束。 – Jaster

+0

由於這些checkbox不能從相應的C#文件訪問,我們如何使用C#代碼 – Abhi

回答

4

您可以使用複選框樣式的單選按鈕來實現互斥行爲。如果你有任何問題,結合單選按鈕:radiobutton-binding

<RadioButton IsChecked="{Binding VMProperty}" GroupName="IsSelectedGroup"> 
    <RadioButton.Style> 
     <Style TargetType="{x:Type RadioButton}"> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="RadioButton"> 
         <CheckBox IsChecked="{Binding IsChecked, Mode=TwoWay, RelativeSource={RelativeSource AncestorType=RadioButton}}" Content="{TemplateBinding Content}" /> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </RadioButton.Style> 
</RadioButton> 

不過,我同意雅斯特爾。如果每行都綁定到一個ViewModel,放置這個邏輯限制的地方就是ViewModel。

+0

來實現這一點,謝謝您的建議。無論在後端使用什麼實現,無需查看控件都可以輕鬆更換樣式並實現預期行爲。我根據您的建議添加了所需的樣式 - 完美無瑕! – SliverNinja

0

我受的第三列「Infor公司」創造這樣的風格嘗試,但它不是在所有工作

<Style x:Key="mutualCheckInForLoop" TargetType="{x:Type WPFtoolkit:DataGridCell}" BasedOn="{StaticResource {x:Type WPFtoolkit:DataGridCell}}"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding ElementName=dgChkRepeatingData,Path=IsChecked}" Value="True"> 
        <Setter Property="CheckBox.IsChecked" Value="False" /> 
       </DataTrigger> 
       <DataTrigger Binding="{Binding ElementName=dgChkMaxElement,Path=IsChecked}" Value="True"> 
        <Setter Property="CheckBox.IsChecked" Value="False" /> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
0

讓您的收藏(通過MV屬性)reposible處理那些「互斥checboxes」,而不是數據網格 - 你的用戶界面不應該爲此類事物重新考慮。

我知道的最簡單的方法是創建一個擁有的集合。

+0

來實現這一點所以我們如何使用C#代碼 – Abhi

0

同意Jaster,這應該在ViewModel中處理。 我們有一個相同的場景,我們在ViewModel中處理它。