C# 样式触发绑定永不释放

C# 样式触发绑定永不释放,c#,.net,binding,datatrigger,C#,.net,Binding,Datatrigger,祝你新年快乐 我的问题是,以样式创建的绑定是否超出范围 让我解释一下,我有一个textblock,它对列表“Names”中两个元素的值进行多重绑定,这是viewmodel中的字符串列表 我使用xaml中的一个神奇字符串通过索引访问这些元素(yikes,我知道,我不知道如何做得不同,如果我在集合上设置绑定,itemChanged事件不会触发绑定…) 我需要对值进行更改,我不想创建任何类型的访问器。我希望这一切都在视图中处理 <TextBlock> <TextBlo

祝你新年快乐

我的问题是,以样式创建的绑定是否超出范围

让我解释一下,我有一个textblock,它对列表“Names”中两个元素的值进行多重绑定,这是viewmodel中的字符串列表

我使用xaml中的一个神奇字符串通过索引访问这些元素(yikes,我知道,我不知道如何做得不同,如果我在集合上设置绑定,itemChanged事件不会触发绑定…)

我需要对值进行更改,我不想创建任何类型的访问器。我希望这一切都在视图中处理

<TextBlock>
        <TextBlock.Style>
            <Style TargetType="TextBlock">
                <Setter Property="Text"
                        Value="" />
                <Style.Triggers>
                    <DataTrigger Binding="{Binding Path=IsGroupedBy, UpdateSourceTrigger=PropertyChanged, RelativeSource={RelativeSource  Mode=FindAncestor, AncestorType=Window}}"
                                 Value="True">
                        <Setter Property="Text">
                            <Setter.Value>
                                <MultiBinding Converter="{StaticResource ConcatStringConvertor}"
                                              UpdateSourceTrigger="PropertyChanged"
                                              Mode="OneWay">
                                    <Binding Path="Names[1]"
                                             RelativeSource="{RelativeSource  Mode=FindAncestor, AncestorType=Window}"
                                             UpdateSourceTrigger="PropertyChanged" />
                                    <Binding Path="Names[2]"
                                             RelativeSource="{RelativeSource  Mode=FindAncestor, AncestorType=Window}"
                                             UpdateSourceTrigger="PropertyChanged" />
                                </MultiBinding>
                            </Setter.Value>
                        </Setter>
                    </DataTrigger>
                    <DataTrigger Binding="{Binding Path=IsGroupedBy, UpdateSourceTrigger=PropertyChanged, RelativeSource={RelativeSource  Mode=FindAncestor, AncestorType=Window}}"
                                 Value="False">
                        <Setter Property="Text" Value="0">
                        </Setter>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </TextBlock.Style>
    </TextBlock>
我认为条件绑定可以解决这个问题,但它不

我愿意接受任何解决方案(特别是如果我能找到从绑定中删除这些名称[1]的方法)

PS:对不起我的英语

EDIT :
    public ObservableCollection<string> Names { get; set; }
编辑3: 以下是真正的绑定:

<DataTemplate x:Key="customGroupValueTemplate">
            <Grid Width="{Binding ElementName=uxGrid, Path=ActualWidth}">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto" />
                    <ColumnDefinition Width="Auto" />
                    <ColumnDefinition Width="Auto" />
                    <ColumnDefinition />
                    <ColumnDefinition Width="Auto" />
                    <ColumnDefinition Width="Auto" />
                    <ColumnDefinition Width="60" />
                </Grid.ColumnDefinitions>
                <dxe:CheckEdit  Grid.Column="0"
                                Initialized="cbGroupSummary_Initialized"
                                Checked="cbGroupSummary_Checked"
                                Unchecked="cbGroupSummary_Unchecked"
                                Content="{Binding Value}" />
                <TextBlock Grid.Column="2"
                           Margin="10,0,0,0"
                           VerticalAlignment="Center"
                           Text="{Binding Path=(dxg:RowData.RowData).GroupSummaryData[0].Text, RelativeSource={RelativeSource TemplatedParent}}" />
                <TextBlock  Grid.Column="4"
                            Margin="10,0,0,0"
                            HorizontalAlignment="Right"
                            VerticalAlignment="Center">
                    <TextBlock.Text>
                        <MultiBinding Converter="{StaticResource GetPercentAsTextConv}"
                                      UpdateSourceTrigger="PropertyChanged"
                                      Mode="OneWay">
                            <Binding Path="(dxg:RowData.RowData).GroupSummaryData[1].Value"
                                     RelativeSource="{RelativeSource Self}"
                                     UpdateSourceTrigger="PropertyChanged" />
                            <Binding Path="(dxg:RowData.RowData).GroupSummaryData[2].Value"
                                     RelativeSource="{RelativeSource Self}"
                                     UpdateSourceTrigger="PropertyChanged" />
                        </MultiBinding>
                    </TextBlock.Text>
                </TextBlock>
                <ProgressBar  Grid.Column="5"
                              Width="100"
                              Height="10"
                              Margin="10 0 0 0"
                              HorizontalAlignment="Right"
                              VerticalAlignment="Center">
                    <ProgressBar.Value>
                        <MultiBinding Converter="{StaticResource GetPercentConv}"
                                      UpdateSourceTrigger="PropertyChanged"
                                      Mode="OneWay">
                            <Binding Path="(dxg:RowData.RowData).GroupSummaryData[1].Value"
                                     RelativeSource="{RelativeSource TemplatedParent}"
                                     UpdateSourceTrigger="PropertyChanged" />
                            <Binding Path="(dxg:RowData.RowData).GroupSummaryData[2].Value"
                                     RelativeSource="{RelativeSource TemplatedParent}"
                                     UpdateSourceTrigger="PropertyChanged" />
                        </MultiBinding>
                    </ProgressBar.Value>
                </ProgressBar>
            </Grid>
        </DataTemplate>


请注意它是一个模板。

我想你的意思是IsGroupedBy而不是useBinding。
这不是很好的解决方案,但您可以用
Binding Path=“Names.ElementAtOrDefault(1)”替换
Binding Path=“Names[1]”

为什么要使用多重绑定

<TextBlock>
    <TextBlock.Style>
        <Style TargetType="TextBlock">
            <Style.Triggers>
                <DataTrigger Binding="{Binding Path=IsGroupedBy, UpdateSourceTrigger=PropertyChanged, RelativeSource={RelativeSource  Mode=FindAncestor, AncestorType=Window}}"}" Value="True">
                    <Setter Property="Text" Value="{Binding Path=Names, Converter={StaticResource FirstTwoListValuesElemToStringConverter}}"/>
                </DataTrigger>
                <DataTrigger Binding="{Binding Path=IsGroupedBy, UpdateSourceTrigger=PropertyChanged, RelativeSource={RelativeSource  Mode=FindAncestor, AncestorType=Window}}"}" Value="False">
                    <Setter Property="Text" Value="0"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </TextBlock.Style>
</TextBlock>

和转换器

[ValueConversion(typeof(ObservableCollection<string>), typeof(string))]
class FirstTwoListValuesElemToStringConverter: IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        System.Collections.ObjectModel.ObservableCollection<string> names = ((System.Collections.ObjectModel.ObservableCollection<string>)value);
        if ((names != null) && (names.Count > 2))
            return names.FirstOrDefault() + names.ElementAtOrDefault(1);
        else
            return System.Windows.DependencyProperty.UnsetValue;
    }
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) => throw new NotImplementedException();
}
[ValueConversion(typeof(observetecollection)、typeof(string))]
类FirstTwoListValueSelemToString转换器:IValueConverter
{
公共对象转换(对象值、类型targetType、对象参数、System.Globalization.CultureInfo区域性)
{
System.Collections.ObjectModel.ObservableCollection名称=((System.Collections.ObjectModel.ObservableCollection)值);
如果((names!=null)&&(names.Count>2))
返回names.FirstOrDefault()+names.elementAtOrderFault(1);
其他的
返回System.Windows.DependencyProperty.UnsetValue;
}
公共对象ConvertBack(对象值、类型targetType、对象参数、CultureInfo区域性)=>抛出新的NotImplementedException();
}

Hi,感谢您的回复,很遗憾,这不起作用:
BindingExpression路径错误:“object”“observeCollection”“1”(HashCode=21932166)“上未找到ElementAtOrDefault(1)”属性BindingExpression:Path=Names.ElementAtOrDefault(1)
;DataItem='MainWindow'(名称='');目标元素为“TextBlock”(名称=“”);目标属性为“Text”(类型为“String”)
我试图强制转换到xaml中的可观察集合,但它也不起作用……您能否在viewModel中添加名称声明。为什么你要使用多重绑定,你可以使用一个带名字的绑定,在你的转换器中,你可以连接第一个元素。我更新了这个问题,如果你愿意,我可以给你一个示例项目。我想这会更容易。我的主要问题是如何防止在条件下对绑定求值。好吧,更多详细信息,列表是在控件中创建的(devexpress-controlgrid-GroupRowData.GroupSummaryData[])。我无法修改列表中的对象以触发对列表的更改和绑定。我必须绑定列表中对象的值才能看到更改。我计算一行的两个值的百分比,以在组摘要控件的进度栏中显示它。当我不按列分组时,此数组为空。我在问题cf EDIT 3中添加了真正的绑定
<DataTemplate x:Key="customGroupValueTemplate">
            <Grid Width="{Binding ElementName=uxGrid, Path=ActualWidth}">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto" />
                    <ColumnDefinition Width="Auto" />
                    <ColumnDefinition Width="Auto" />
                    <ColumnDefinition />
                    <ColumnDefinition Width="Auto" />
                    <ColumnDefinition Width="Auto" />
                    <ColumnDefinition Width="60" />
                </Grid.ColumnDefinitions>
                <dxe:CheckEdit  Grid.Column="0"
                                Initialized="cbGroupSummary_Initialized"
                                Checked="cbGroupSummary_Checked"
                                Unchecked="cbGroupSummary_Unchecked"
                                Content="{Binding Value}" />
                <TextBlock Grid.Column="2"
                           Margin="10,0,0,0"
                           VerticalAlignment="Center"
                           Text="{Binding Path=(dxg:RowData.RowData).GroupSummaryData[0].Text, RelativeSource={RelativeSource TemplatedParent}}" />
                <TextBlock  Grid.Column="4"
                            Margin="10,0,0,0"
                            HorizontalAlignment="Right"
                            VerticalAlignment="Center">
                    <TextBlock.Text>
                        <MultiBinding Converter="{StaticResource GetPercentAsTextConv}"
                                      UpdateSourceTrigger="PropertyChanged"
                                      Mode="OneWay">
                            <Binding Path="(dxg:RowData.RowData).GroupSummaryData[1].Value"
                                     RelativeSource="{RelativeSource Self}"
                                     UpdateSourceTrigger="PropertyChanged" />
                            <Binding Path="(dxg:RowData.RowData).GroupSummaryData[2].Value"
                                     RelativeSource="{RelativeSource Self}"
                                     UpdateSourceTrigger="PropertyChanged" />
                        </MultiBinding>
                    </TextBlock.Text>
                </TextBlock>
                <ProgressBar  Grid.Column="5"
                              Width="100"
                              Height="10"
                              Margin="10 0 0 0"
                              HorizontalAlignment="Right"
                              VerticalAlignment="Center">
                    <ProgressBar.Value>
                        <MultiBinding Converter="{StaticResource GetPercentConv}"
                                      UpdateSourceTrigger="PropertyChanged"
                                      Mode="OneWay">
                            <Binding Path="(dxg:RowData.RowData).GroupSummaryData[1].Value"
                                     RelativeSource="{RelativeSource TemplatedParent}"
                                     UpdateSourceTrigger="PropertyChanged" />
                            <Binding Path="(dxg:RowData.RowData).GroupSummaryData[2].Value"
                                     RelativeSource="{RelativeSource TemplatedParent}"
                                     UpdateSourceTrigger="PropertyChanged" />
                        </MultiBinding>
                    </ProgressBar.Value>
                </ProgressBar>
            </Grid>
        </DataTemplate>
<TextBlock>
    <TextBlock.Style>
        <Style TargetType="TextBlock">
            <Style.Triggers>
                <DataTrigger Binding="{Binding Path=IsGroupedBy, UpdateSourceTrigger=PropertyChanged, RelativeSource={RelativeSource  Mode=FindAncestor, AncestorType=Window}}"}" Value="True">
                    <Setter Property="Text" Value="{Binding Path=Names, Converter={StaticResource FirstTwoListValuesElemToStringConverter}}"/>
                </DataTrigger>
                <DataTrigger Binding="{Binding Path=IsGroupedBy, UpdateSourceTrigger=PropertyChanged, RelativeSource={RelativeSource  Mode=FindAncestor, AncestorType=Window}}"}" Value="False">
                    <Setter Property="Text" Value="0"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </TextBlock.Style>
</TextBlock>
[ValueConversion(typeof(ObservableCollection<string>), typeof(string))]
class FirstTwoListValuesElemToStringConverter: IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        System.Collections.ObjectModel.ObservableCollection<string> names = ((System.Collections.ObjectModel.ObservableCollection<string>)value);
        if ((names != null) && (names.Count > 2))
            return names.FirstOrDefault() + names.ElementAtOrDefault(1);
        else
            return System.Windows.DependencyProperty.UnsetValue;
    }
    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) => throw new NotImplementedException();
}