gpt4 book ai didi

c# - 从 ViewModel 中的绑定(bind)更新 DataGrid 背景

转载 作者:行者123 更新时间:2023-12-03 10:54:43 24 4
gpt4 key购买 nike

今天我发现了一些奇怪的东西(对我来说)。如果我想通过 ViewModel 中的属性更新 DataGrid,则绑定(bind)不会收到通知。这里的特别想法是(我认为)绑定(bind)绑定(bind)到另一个对象(集合的一部分)而不是直接我更改的属性。

我为您准备了一些示例代码。但首先是一点(Depper)的解释。

当然这只是一个示例,但这里我有一个带有两个公共(public)属性(Items 和 CurrentItem)的 ViewModel。 Items 是一个 ObservableCollection,用作我的 DataGrid 的 ItemsSource。 CurrentItem 是一个字符串,用作转换器设置背景颜色(用于网格)的指示器。

我将两个实例 o String 添加到我的集合中,并且在程序启动后,行为符合预期。第一行是绿色,第二行是白色(通过转换器和属性设置)。

但是,如果我在加载程序后更改 CurrentItem 的值(让我们说通过按钮),我的 Datagrid 上的颜色将不会更新。

如果我在转换器的开头创建断点,我可以看到(在加载过程之后)转换器不会再次执行,所以它必须是绑定(bind)的问题。我认为问题在于我的属性(property)不属于我的收藏中的项目。 OnPropertyChange 方法似乎没有正确触发 RowStyle 的更新。

在现实生活中,集合的模型类不是字符串,模型类实现了 INotifyPropertyChange(但我认为这不是问题,因为我只是不更新​​模型中的任何内容)。

我需要这种行为来基于动态指示器(类似于示例)突出显示更多行。如果没有人知道更好的方法,我想我会在我的模型中实现某种属性,并使用 ViewModel 中的方法更新属性。

查看型号:

public class MainWindowViewModel : INotifyPropertyChanged
{
public static MainWindowViewModel instance = null;

private string _CurrentItem;

public event PropertyChangedEventHandler PropertyChanged;

protected void OnPropertyChanged(string Property)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(Property));
}
}

public string CurrentItem
{
get
{
return _CurrentItem;
}
set
{
if (value != _CurrentItem)
{
_CurrentItem = value;
OnPropertyChanged("CurrentItem");
OnPropertyChanged("Items");
}
}
}
public ObservableCollection<String> Items { get; set; }

public MainWindowViewModel()
{
instance = this;
Items = new ObservableCollection<string>();

CurrentItem = "First";

Items.Add("First");
Items.Add("Second");
Items.Add("First");

}

查看 XAML

<Window.DataContext>
<local:MainWindowViewModel />
</Window.DataContext>
<Window.Resources>
<local:StringToColorConverter x:Key="StringToColorConverter" />
</Window.Resources>
<DockPanel Margin="30">
<Button DockPanel.Dock="bottom" Content="From First to Second" Click="Button_Click" />
<DataGrid IsReadOnly="True" ItemsSource="{Binding Items}" ColumnWidth="*" AutoGenerateColumns="False">
<DataGrid.RowStyle>
<Style TargetType="DataGridRow">
<Setter Property="Background"
Value="{Binding Converter={StaticResource StringToColorConverter}}" />
</Style>
</DataGrid.RowStyle>
<DataGrid.Columns>
<DataGridTextColumn Header="Text" Binding="{Binding}" />
</DataGrid.Columns>
</DataGrid>
</DockPanel>

转换器

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var item = value as string;

if (item == MainWindowViewModel.instance?.CurrentItem)
return "Green";
return "White";
}

很抱歉这么长的帖子,我希望你能理解我的问题,当然也许能帮助我:)

最佳答案

您可以使用 IMultiValueConverter 涉及 CurrentItem

<DataGrid.RowStyle>
<Style TargetType="DataGridRow">
<Setter Property="Background">
<Setter.Value>
<MultiBinding Converter="{StaticResource MultiStringToColorConverter}">
<Binding />
<Binding Path="DataContext.CurrentItem"
RelativeSource="{RelativeSource FindAncestor,
AncestorType={x:Type Window}}"/>
</MultiBinding>
</Setter.Value>
</Setter>
</Style>
</DataGrid.RowStyle>

转换器
public class MultiStringToColorConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter,
System.Globalization.CultureInfo culture)
{
var item = values[0] as string;
var current = values[1] as string;

if (item == current)
return new SolidColorBrush(Colors.Green);
return new SolidColorBrush(Colors.White);
}

public object[] ConvertBack(object values, Type[] targetType, object parameter,
System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}

关于c# - 从 ViewModel 中的绑定(bind)更新 DataGrid 背景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38131286/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com