Wpf 如何在datagrid列中多重绑定数据和StringFormat?

Wpf 如何在datagrid列中多重绑定数据和StringFormat?,wpf,datagrid,string-formatting,Wpf,Datagrid,String Formatting,我有一个带有数字列的WPF数据网格,这些列最初的格式没有小数 用户有一个复选框来选择数字格式以显示0或2位小数。下面显示了该列的xaml <DataGridTemplateColumn Header="Qty" Width="40" IsReadOnly="False" CellStyle="{StaticResource EditCell}"> <DataGridTemplateColumn.CellTemplate> <DataTempl

我有一个带有数字列的WPF数据网格,这些列最初的格式没有小数

用户有一个复选框来选择数字格式以显示0或2位小数。下面显示了该列的xaml

<DataGridTemplateColumn Header="Qty" Width="40" IsReadOnly="False" CellStyle="{StaticResource EditCell}">
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding ItemQuantity, StringFormat={}{0:#}}" TextAlignment="Right" />
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
    <DataGridTemplateColumn.CellEditingTemplate>
        <DataTemplate>
            <TextBox x:Name="textbox"  BorderThickness="0" HorizontalContentAlignment="Right" Background="LightYellow">
                <Binding Path="ItemQuantity" StringFormat="N0" UpdateSourceTrigger="LostFocus" >
                    <Binding.ValidationRules>
                        <c:DecimalRangeRule Min="0" Max="999999.99"/>
                    </Binding.ValidationRules>
                </Binding>
            </TextBox>
        </DataTemplate>
    </DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
DataGridTemplateColumn已更改为使用多重绑定:

<DataGridTemplateColumn Header="Qty" Width="40" IsReadOnly="False"  CellStyle="{StaticResource EditCell}">
    <DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
        <TextBlock HorizontalAlignment="Right" >
                <TextBlock.Text>
                <MultiBinding Converter="{StaticResource NumericFormat}">
                <Binding Path="GroupQuantity" />
                <Binding ElementName="chkSmallValue" Path="IsChecked"/>
                </MultiBinding>
            </TextBlock.Text>
        </TextBlock>
    </DataTemplate>

    </DataGridTemplateColumn.CellTemplate>
    <DataGridTemplateColumn.CellEditingTemplate>
    <DataTemplate>
        <TextBox x:Name="textbox" BorderThickness="0" HorizontalContentAlignment="Right" Background="LemonChiffon" PreviewTextInput="TextBox_PreviewTextInput" >
            <MultiBinding Converter="{StaticResource NumericFormat}"  UpdateSourceTrigger="LostFocus">
            <Binding Path="GroupQuantity" />
            <Binding ElementName="chkSmallValue" Path="IsChecked" Mode="OneWay"/>
            </MultiBinding>
        </TextBox>
    </DataTemplate>
    </DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>

由于StringFormat不是依赖性属性,因此无法将其绑定到任何值以进行更改。 要更改它,您必须在单元格的visualtree中找到TextBlock,然后在代码隐藏中更改BindingExpression的StringFormat。但这种方法很糟糕


您可以不使用StringFormat,而是使用多值转换器将TextBlock.Text-to复选框的IsChecked属性和ItemQuantity进行多绑定。在转换器中,您可以根据选中的复选框返回格式化字符串,因为StringFormat不是依赖性属性,您不能将其绑定到任何值来更改它。 要更改它,您必须在单元格的visualtree中找到TextBlock,然后在代码隐藏中更改BindingExpression的StringFormat。但这种方法很糟糕


您可以不使用StringFormat,而是使用多值转换器将TextBlock.Text-to复选框的IsChecked属性和ItemQuantity进行多绑定。在转换器中,您可以根据选中的复选框返回格式化字符串。您可以使用EventToCommandTrigger(事件到命令触发器),它会将您带到ViewModel中,您可以更改ItemQuantity中的小数位数


在ViewModel中执行此操作将允许您围绕功能编写单元测试以进行测试。

您可以使用EventToCommandTrigger,它将带您进入ViewModel,您可以在其中更改ItemQuantity中的小数位数


在ViewModel中执行此操作将允许您围绕功能编写单元测试以进行测试。

您可以使用复选框的“选中”和“未选中”事件在代码中设置绑定


您可以使用复选框的“Checked”和“Unchecked”事件在代码中设置绑定


您是否考虑使用IValueCurvter?您可以使用在转换器中被绑定到复选框的布尔属性来从转换器返回格式化字符串。正如@ NIT指出的,您不能轻易更改String格式,但可以在触发器内更改整个绑定。您是否考虑使用IValueCurrVter?您可以在转换器中使用绑定到复选框的布尔属性从转换器返回格式化字符串。正如@nit所指出的,您无法轻松更改StringFormat,但可以在触发器内更改整个绑定。感谢您的指导。我得调查一下,看看怎么做。谢谢你的指导。我必须研究如何使其工作。我需要从驻留在DataGrid列中的textbox访问绑定属性。我需要从驻留在DataGrid列中的textbox访问绑定属性。
<DataGridTemplateColumn Header="Qty" Width="40" IsReadOnly="False"  CellStyle="{StaticResource EditCell}">
    <DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
        <TextBlock HorizontalAlignment="Right" >
                <TextBlock.Text>
                <MultiBinding Converter="{StaticResource NumericFormat}">
                <Binding Path="GroupQuantity" />
                <Binding ElementName="chkSmallValue" Path="IsChecked"/>
                </MultiBinding>
            </TextBlock.Text>
        </TextBlock>
    </DataTemplate>

    </DataGridTemplateColumn.CellTemplate>
    <DataGridTemplateColumn.CellEditingTemplate>
    <DataTemplate>
        <TextBox x:Name="textbox" BorderThickness="0" HorizontalContentAlignment="Right" Background="LemonChiffon" PreviewTextInput="TextBox_PreviewTextInput" >
            <MultiBinding Converter="{StaticResource NumericFormat}"  UpdateSourceTrigger="LostFocus">
            <Binding Path="GroupQuantity" />
            <Binding ElementName="chkSmallValue" Path="IsChecked" Mode="OneWay"/>
            </MultiBinding>
        </TextBox>
    </DataTemplate>
    </DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
private void HandleCheck(object sender, RoutedEventArgs e)
{
    var binding = new Binding
    {
        Path = new PropertyPath("ItemQuantity"),
        StringFormat = "{0:0.00}"
    };
    textBoxName.SetBinding(TextBox.TextProperty, binding);
}

private void HandleUnchecked(object sender, RoutedEventArgs e)
{
    var binding = new Binding
    {
        Path = new PropertyPath("ItemQuantity"),
        StringFormat = "{0:0}"
    };
    textBoxName.SetBinding(TextBox.TextProperty, binding);

}