C# WPF MVVM镜像源更新

wmomyfyw  于 12个月前  发布在  C#
关注(0)|答案(2)|浏览(157)

我试图从视图模型更新xml中的图像源,但似乎我不能这样做,我不明白我错过了什么。
所以.在视图xml中,我有一个图像,我为模型中的一个字符串做了一个绑定。

<Image x:Name="Pick1Image"
       Grid.Row="7"
       Grid.Column="0"
       Grid.ColumnSpan="6"
       Source="{Binding ImagePath}"
       Style="{StaticResource Image_Viewer_Pick}"/>

字符串
然后,在我的视图模型中,我做了这个部分,在其中我检查一个变量的值,并相应地将路径字符串分配给绑定变量。

public string SelectedPart
{
    get { return _selectedPart; }
    set
    {
        _selectedPart = value;

        if (_selectedPart == "SX")
        {
            _imagesource = "/Images/main_view.png";
        }

        if (_selectedPart == "DX")
        {
            _imagesource = "/Images/second_view.png";
        }

        if (_selectedPart == "TX")
        {
            _imagesource = "/Images/third_view.png";
        }
    }
}


当然,我有绑定变量声明和OnPropertyChanged()调用。

public string ImagePath
{
    get { return _imagesource; }
    set { _imagesource = value; OnPropertyChanged(); }
}


如果我使用Messagebox.Show(ImagePath)变量变化正常,但图像保持不变。可能是什么问题?
谢谢你,谢谢

更新一:

我尝试了Michalis的方法,但没有运气。所以我做的是这样的:
在ViewModel中:

public BitmapImage bitmap;

public BitmapImage Image
{
    get { return bitmap; }
    set
    {
        bitmap = value;
        OnPropertyChanged();
    }
}

public string SelectedPart
{
    get { return _selectedPart; }
    set
    {
        _selectedPart = value;

        if (_selectedPart == "SX")
        {
            bitmap = new BitmapImage();
            bitmap.BeginInit();
            bitmap.UriSource = new Uri(@"\Images\main_view.png", UriKind.Relative);
            bitmap.EndInit();
        }
    }
}


在XAML中,我将Image Source Binding改为Image。

更新2

这是Image_Viewer_Pick控件样式:

<Style x:Key="Image_Viewer_Pick" TargetType="{x:Type Image}">
    <Setter Property="HorizontalAlignment" Value="Center"/>
    <Setter Property="VerticalAlignment" Value="Center"/>
    <Setter Property="Stretch" Value="Uniform"/>
    <Setter Property="Width" Value="405"/>
    <Setter Property="Height" Value="300"/>
    <Setter Property="Margin" Value="0,0,0,0"/>
</Style>

最终更新-已解决

if(_selectedPart == "SX")
                {
                    _imagesource = "/Images/main_view.png";
                    ImagePath = _imagesource;
                }


看起来Andy对ImagePath赋值而不是_imagesignition有一个很好的观点。在这个更新中的代码似乎解决了这个问题。不确定我是否完全理解这个问题,但我会尝试解决它。
太感谢你们了!谢谢你,安迪!

jdgnovmf

jdgnovmf1#

这里有一个简单的例子,我敲了。
我在这里使用mvvm community toolkit,因为使用它可以稍微快一点。
主窗口:

Title="MainWindow" Height="450" Width="800">
<Window.DataContext>
    <local:MainWindowViewmodel/>
</Window.DataContext>
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="160"/>
    </Grid.ColumnDefinitions>
    <Image Source="{Binding PicPath}"/>
    <StackPanel Grid.Column="1">
        <TextBox Text="{Binding PicPath}"/>
        <Button Content="Take Focus"/>
    </StackPanel>
</Grid>
</Window>

字符串
这个按钮的全部目的是给予视图中的其他东西可以很容易地获得焦点。所以我可以用tab键调出文本框,绑定将文本传输到viewmodel。
主窗口视图模型

public partial class MainWindowViewmodel : ObservableObject
{
    [ObservableProperty]
    private string picPath = "/Images/DSC00025.jpg";
}
}


这将生成一个公共属性PicPath。
我有两张图片在一个图像文件夹。我已经设置了这些文件的属性,所以当我编译时,文件被复制到exe文件的旁边。这是一种可能性。
另一个是你有两个视图模型的示例。这是我们在SO上看到的一个很常见的事情,当然一个示例是绑定的。另一个示例的属性发生了变化,所以没有变化是可见的。
另一种可能性是您依赖于设置SelectedPart来更改图片。
在这种情况下,

ImagePath = "/Images/main_view.png";


这将引起财产的变化。
而不是

_imagesource = "/Images/main_view.png";


的数据
我看到了图片。如果我用6和tab重写5,然后文本传播到视图模型,视图被通知并读取属性。第二张图片显示。
当我在编译后查看磁盘上的bin时,我在那里看到了我的图片文件:



我想给你看它运行的样子,但我很懒,从磁盘上抓取了那些照片,它们是一个孩子的。
如果我改变它,使按钮改变图片:

public partial class MainWindowViewmodel : ObservableObject
{
    [ObservableProperty]
    private string picPath = "/Images/DSC00025.jpg";
    
    [RelayCommand]
    private async Task ChangePicture()
    {
        PicPath = "/Images/DSC00026.jpg";
    }
}


和按钮

<Button Content="Change Picture"
                Command="{Binding ChangePictureCommand}"
                />


这也成功地改变了画面。

km0tfn4u

km0tfn4u2#

您需要将ImageSource/bitmap类型绑定到控件,或者另一种方法是尝试将您的图像路径与转换器绑定,该转换器将图像路径转换为ImageSource。

相关问题