gpt4 book ai didi

c# - WPF 从单独的绑定(bind)到 ViewModel

转载 作者:行者123 更新时间:2023-12-03 10:31:13 25 4
gpt4 key购买 nike

我正在尝试在我的 ViewModel 和一个按钮的 ControlTemplate 之间创建一个绑定(bind),该按钮位于我的 View 调用的单独文件中。
到目前为止,没有一个标准方法起作用,我不确定如何告诉 ControlTemplate 按钮,该按钮可以从任何 View (实际上我在 2 个 View 中使用)调用,以使用附加到调用它的 View 的 ViewModel。一直在寻找几个小时没有解决方案(既没有解释也没有例子可以推断)。我的措辞可能不正确。我正在为 MVVM 使用 Caliburn Micro。
ShellViewModel 包含以下内容,这是在我的 ShellView/ViewModel 激活 View/ViewModel 时设置的(Shell 保持打开状态,调用时其他存在于其中)。

public void LoadBuy()
{
ButtonBkgdBuy = "Blue";
ActivateItem(BuyViewModel);
}

private string _buttonBkgdBuy = "Green";
public string ButtonBkgdBuy
{
get { return _buttonBkgdBuy; }
set
{
_buttonBkgdBuy = value;
NotifyOfPropertyChange(() => ButtonBkgdBuy);
}
}
在 ShellView 中单击我的按钮正确更新 ButtonBkgdBuy 并激活我的 BuyViewModel。
按钮本身不会改变它的颜色,也不会在cs中将正确的原始颜色设置为默认值。这是 ShellView 中的按钮:
<StackPanel>
<Button Template="{DynamicResource BlackButton}" x:Name="LoadBuy" Width="238" Margin="15,0,0,0" FontSize="24" Height="40" Content="Browse Our Selection"/>
</StackPanel>
模板在单独的文件中,并在 App.xaml 中引入:
<Application x:Class="Retail_Kiosk.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Retail_Kiosk">
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary>
<local:Bootstrapper x:Key="Bootstrapper" />
<Brush x:Key="BorderMain">#700000</Brush>
<Brush x:Key="BorderAccent">#7c4599</Brush>
</ResourceDictionary>
<ResourceDictionary Source="Templates\ButtonBlack.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</Application>
最后,一个完整版本的按钮文件,以避免遗漏一些东西。有问题的行我在之前和之后添加了评论
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<ControlTemplate TargetType="{x:Type Button}" x:Key="BlackButton">
<Button Height="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=ActualHeight}"
BorderBrush="{x:Null}" BorderThickness="0"
Content="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Content}"
>
<Button.Effect>
<DropShadowEffect BlurRadius="12" Color="Gray" Direction="270" Opacity=".8" ShadowDepth="3" />
</Button.Effect>

<Button.Template>
<ControlTemplate TargetType="Button">
<Grid Width="{Binding RelativeSource={RelativeSource AncestorType=Button}, Path=ActualWidth}"
Height="{Binding RelativeSource={RelativeSource AncestorType=Button}, Path=ActualHeight}">
<Border x:Name="MainBorder" CornerRadius="3" Grid.ColumnSpan="2" Margin="0,0,4,4" BorderBrush="Black" BorderThickness="1">
<Border.Background>
<LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1">
<GradientStop Color="#FF5E5E5E" Offset="0" />
<!-- BEGIN: This is the Gradient that should be supplied a color, I know Binding isn't a full option, it's just my resting default. -->
<!-- If I add a color directly, the button has the color. Code is correct. If I try any of my binding attempts, binding fails and no color.-->
<GradientStop Color="{Binding}" Offset="1" />
<!-- END -->
</LinearGradientBrush>
</Border.Background>
<Grid >
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>

<Border CornerRadius="2" Margin="0" BorderBrush="LightGray" BorderThickness="0,1,0,0" Grid.ColumnSpan="2" Grid.RowSpan="2" />

<Grid Grid.Column="1" HorizontalAlignment="Left" VerticalAlignment="Center">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>

<TextBlock x:Name="Title" Text="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Content, FallbackValue='Button'}"
Grid.Column="1" Grid.Row="0" FontFamily="Calibri" FontWeight="Bold"
FontSize="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=FontSize}"
Foreground="White" Margin="10,0,0,0" Padding="0,0,0,0"/>
</Grid>
</Grid>
</Border>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="MainBorder" Property="Background">
<Setter.Value>
<LinearGradientBrush>
<GradientStop Color="#000000" Offset="0" />
<GradientStop Color="Aqua" Offset="1" />

</LinearGradientBrush>
</Setter.Value>
</Setter>
</Trigger>
<Trigger Property="IsPressed" Value="True">
<Setter TargetName="MainBorder" Property="Background">
<Setter.Value>
<LinearGradientBrush>
<GradientStop Color="#000000" Offset="0" />
<GradientStop Color="#7f10b3" Offset="1" />
</LinearGradientBrush>
</Setter.Value>
</Setter>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Button.Template>
</Button>
</ControlTemplate>
</ResourceDictionary>
感谢您的任何帮助。我从未尝试过这样的绑定(bind),虽然我认为可能,但不确定这会被称为什么。我很高兴阅读它,只要我知道要搜索什么。

最佳答案

直接绑定(bind)到 ButtonBkgdBu应该可以工作,前提是 Button当前应用模板的具有 DataContext与公众 ButtonBkgdBuy返回 Color 的属性:

<GradientStop Color="{Binding ButtonBkgdBuy}" Offset="1" />
如果您希望能够为不同的数据上下文使用相同的模板,您应该创建一个 attached property并绑定(bind)到这个或使用 Tag Button 的属性(property)或任何其他属性(property)本身:
<GradientStop Color="{Binding Tag, RelativeSource={RelativeSource AncestorType=Button}}" Offset="1" />
然后,您可以在每个 Button 上的模板中设置您绑定(bind)到的属性。实例:
<StackPanel>
<Button Template="{DynamicResource BlackButton}"
Tag="Green"
x:Name="LoadBuy" Width="238" Margin="15,0,0,0" FontSize="24" Height="40" Content="Browse Our Selection"/>
</StackPanel>

关于c# - WPF 从单独的绑定(bind)到 ViewModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63292947/

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