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